zoukankan      html  css  js  c++  java
  • sql where 1=1 的详细解释

    原文来自:https://blog.csdn.net/zc474235918/article/details/50544484

    看一下这两个句子:

    select * from user 
    select * from user where 1=1

    这两个 句子执行结果是一样一样的。而sql注入就是利用了这个原理 来进行破坏。比如:

    select * from user where id='1000'

    如果允许用户输入的话,那么这个句子就成了:

    select * from user where id='XXX' or 1=1

    这样的话,这个句子就是恒成立的了。

           上述1=1 的使用,会影响预先指定的查询结果,使得本来要查询的数据 失效。 
           where 1=1 这种写法 虽然给程序开发人员带来不便,还要避免sql注入的问题。       但 “1=1” 这种写法 也会给程序编写增加了方便。

    1=1 可以很方便的规范语句

           对于组合查询的来说,因为查询比较模糊,而查询的where条件的个数也不确定。 
    一般这样的sql语句进行查询的时候:

    sql.append("select * from User");
    if (whereUser.getID()!="") {
        sql.append(" where ID=@id");
    }
    if (whereUser.getName()!="") {
        sql.append(" and Name=@name");
    }
    if (whereUser.getAddress()!="") {
        sql.append(" and Phone=@phone");
    }

           对于上述这种写法,逻辑上感觉没有问题。但是如果whereUser里面的id为空。那么最后拼接出来得到的语句会成:

    select * from User and Name='XXX' and Phone='XXX'.

           这条语句 没有where关键字,肯定会报错的。 
           但是如果说,既然条件个数未知,那么把where关键字放到 if外面去:

    sql.append("select * from User");
    sql.append("where");
    
    if (whereUser.getID()!="") {
        sql.append(" ID=@id");
    }
    if (whereUser.getName()!="") {
        sql.append(" and Name=@name");
    }
    if (whereUser.getAddress()!="") {
        sql.append(" and Phone=@phone");
    }

           这样写的话,如果三个条件都为空。则这是一条不带查询条件的查询。那么最后这条语句会被解析成:

    select * from User where;

           这条语句,空有where关键字 没有条件,照样会报错的。

           对于解决上述这种未知的问题,只能进行各种情况的判断进行拼接。

    当然可以用“where 1=1”进行代码的规范:

    sql.append("select * from User where 1=1 ");
    if (whereUser.getID()!="") {
        sql.append(" and ID=@id");
    }
    if (whereUser.getName()!="") {
        sql.append(" and Name=@name");
    }
    if (whereUser.getAddress()!="") {
        sql.append(" and Phone=@phone");
    }

           对于上述的这种写法,无论是否有条件 都是可以成立的。

    无条件的的时候:

    select * from User where 1=1;

    有条件的时候:

    select * from User where 1=1 and id='XX' ……;

           这样写的代码,会比 分情况判断的代码 更规范。对于以上的写法,并不是唯一的。也可以使 where ‘a’=’a’ 、’a’<>’b’等。

  • 相关阅读:
    java8 快速实现List转map 、分组、过滤等操作
    Centos7系统备份与恢复
    BDI3000仿真器命令
    MIPS32地址映射和TLB
    三层交换机之报文转发流程
    三层交换机之搜索引擎
    三层交换机之端口丢包问题分析
    嵌入式Linux之虚拟内存管理
    Windows网络命令大全
    三层交换机之端口镜像(Mirror)
  • 原文地址:https://www.cnblogs.com/qcq0703/p/9099199.html
Copyright © 2011-2022 走看看