写点什么

程序员在编程过程中,经常会在代码中使用到“where 1=1”,这是为什么呢?

用户头像
小Q
关注
发布于: 2020 年 11 月 13 日

SQL注入



初次看到这种写法的同学肯定很纳闷,加不加where 1=1,查询不都一样吗?例如:



select * from customers;





select * from customers where 1=1;

查询出来的结果完全没有区别呀。



是的,上面的查询结果是没有区别,但是这并不是我们要添加它的目的。我们知道1=1表示true,即永真,在SQL注入时配合or运算符会得到意向不到的结果。



例如,当我们要删除客户名称为“张三”的记录,我们可以这样写:



delete from customers where name='张三'

这个时候如果在where语句后面加上 or 1=1会是什么后果?即:



delete from customers where name='张三' or 1=1

本来只要删除张三的记录,结果因为添加了or 1=1的永真条件,会导致整张表里的记录都被删除了。



当然这种事我们可千万不能干,也不能让别人有机可乘,这里只是为了表述where 1=1的作用之一。



语法规范



我们在写代码的过程中,为了保证语法规范的时候,也会使用到where 1=1。



我们先看下面这段Java代码:



String sql="select * from table_name where 1=1";



if( condition 1) {



 sql=sql+" and var2=value2";



}



if(condition 2) {



 sql=sql+" and var3=value3";



}



如果我们不写1=1的话,当condition 1为真时,代码拼接后被执行的SQL代码如下:



select * from table_name where and var2=value2;



很明显,这里会出现一个SQL 的语法错误:and必须前后都有条件。



有人说我直接把where写在if语句里面,我就不写where 1=1。



String sql="select * from table_name";



if( condition 1) {



 sql=sql+" where var2=value2 ";



}



if(condition 2) {



 sql=sql+" where var3=value3";



}



当condition 1为真,condition 2为假时,上面被执行的SQL代码为:



select * from table_name where var2=value2;



这个确实没有语法错误,但是当condition 1和condition 2都为真呢?那么SQL语句就变成了这样:



select * from table_name



where var2=value2



where var3=value3;



很明显这是不符合SQL语法规范的。



这里写上where 1=1 是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误,加上1=1后,不管后面有没有and条件都不会造成语法错误了。



拷贝表



在我们进行数据备份时,也经常使用到where 1=1,当然其实这两可以不写,写上之后如果想过滤一些数据再备份会比较方便,直接在后面添加and条件即可。



create table table_name



as  



select * from Source_table



where   1=1;



复制表结构



有1=1就会有1<>1或1=2之类的永假的条件,这个在拷贝表的时候,加上where 1<>1,意思就是没有任何一条记录符合条件,这样我们就可以只拷贝表结构,不拷贝数据了。



create table table_name



as  



select * from  



Source_table where   1 <> 1;

更多SQL相关技术内容,请关注公号:Java架构师联盟



发布于: 2020 年 11 月 13 日阅读数: 24
用户头像

小Q

关注

还未添加个人签名 2020.06.30 加入

小Q 公众号:Java架构师联盟 作者多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果能为您提供帮助,请给予支持(关注、点赞、分享)!

评论

发布
暂无评论
程序员在编程过程中,经常会在代码中使用到“where 1=1”,这是为什么呢?