本帖最后由 WYhack 于 2009-09-22 20:00:59 编辑

解决方案 »

  1.   

     'x'='x' 这个是横恒成立的,前面有or 整个 sql 语句搜出来就有值了
      

  2.   

    首先,与'x'='x'的逻辑关系符为or
    而'x'='x'永远为真,你说是不是能把所有记录查询出来呢?
      

  3.   

    找一下SQL 注入的文章看一下就明白了
      

  4.   

    http://topic.csdn.net/u/20081205/09/3dd06076-bcbe-45d4-998c-8999fdbe6fae.htmlSQL注入 整理贴~
      

  5.   

    参考小麦六楼的连接
    id='某用户id'and password='aaaaaa'or'x'='x'or的优先级比and高 所以先执行'x='x'这个恒等式 
      

  6.   

    password='aaaaaa'or'x'='x' 意思是 只要有一个为真就为真,不管两个哪一个为假,最后得出的结果都一样 (password='aaaaaa'or'x'='x')是恒真的 所以在查询的时候就可以不把它看做条件,因此条件就只有一个id了,就是无论你的password值是否正确,这个查寻都不以password为准……
      

  7.   

    我知道password='aaaaaa'or'x'='x'是恒真的,为什么它恒真就意味着相当于一个正确的password????还是说它恒真了就不验证password了,那么着又是为什么呢???
      

  8.   


    or的优先级比and高吗???不是吧!!!好的,不管优先级了,可能是我对select查询的原理不理解,那么就算是id'and password='aaaaaa'or'x'='x'恒等成立为什么查询就与password无关了??还有,为什么一个id就可以查询多有的用户名???
      

  9.   


    /*
    or 是 "或"关系, 只要有一个条件满足就可以了.
    and 是 "并"关系,要两个条件同时满足才可以.
    动态SQL一般用 sp_executesql, 来防止SQL注入.下面的语句就不会被注入了
    */
    DECLARE @id     INT
    DECLARE @pw     VARCHAR(100)
    SET @id = 1
    SET @pw = '''aaaaaa'' OR 1 = 1'
    EXEC sp_executesql N'select name from person where id = @id and password = @pw'
                 ,N'@id INT, @pw VARCHAR(100)'
                 ,@id = @id, @pw = @pw
    GO/*而下面的语句, SQL优化器因为最后有 OR 'x'='x' 认为整个 where 条件恒为 True 
     ,而直接忽略前面 id 和 password的验证 (即使验证前面2个条件也是多此一举)*/
    SELECT name FROM person where id='某用户id'and password='aaaaaa' OR 'x'='x'
    GO--但是下面的情况(表名为变量)用 sp_executesql 就会出错
    DECLARE @tablename  VARCHAR(100)
    SET @tablename = 'sys.objects'
    EXEC sp_executesql N'select * from @tablename', N'@tablename VARCHAR(100)', @tablename = @tablename
    GO-- 用 EXEC 不会出错
    DECLARE @tablename  VARCHAR(100)
    SET @tablename = 'sys.objects'
    EXEC ('select * from ' + @tablename)
    GO
      

  10.   


    就像你所说的 恒等成立 
    select * from table where  ……
    查询时 where 后面的 就可以看做是true和false ,当id和密码都满足时就是TRUE 或者说 数据库中有满足的数据是就是true 相反则false  就是麽有相应的数据。现在你这里都横成立的 就是数据库的所有记录都符合你的条件(无所谓你输入的是什么……),所以差的的所有记录,而不是你所说的一个id可以查所有用户(这里你的id不做查询条件了,已经……)