不会!除非 SP 里有 动态SQL

解决方案 »

  1.   

    动态SQL?你指得就是参数变量,参数表吧
    那我这个存储过程是安全的.是吧
      

  2.   

    --传进来会变成这样子.当然安全啦CREATE PROCEDURE chekUser
    @ username varchar(20),
    @password varchar(20)
    AS
      IF EXISTS(SELECT username,password FROM users
        WHERE username='' or''='' and password='' or''='')        
      RETURN -1
      ELSE
      RETURN 1
    GO
      

  3.   

    动态SQL:
    就是在你的变量没传进来之前,sql语句还没生成.要用exec(@sql)
    那样的话会把你的or 关系动态生成到你的sql语句中,
    那样的话就危险了.
      

  4.   

    IF EXISTS(SELECT username,password FROM users
        WHERE username='' or''='' and password='' or''='')
    这样不是if条件为真了,跟写sql语句一样也可以直接进入,安全?
      

  5.   

    传进来
    是这样
     IF EXISTS(SELECT username,password FROM users
        WHERE username=' or''=' and password=' or''=')      
    还是这样
     IF EXISTS(SELECT username,password FROM users
        WHERE username='' or''='' and password='' or''='')      
    有点晕了.
      

  6.   

    是前一个吧
    前一个if永远是假的,后一个if永远是真的,就可能被注入了
    谁证实一下就结贴
      

  7.   

    你不过滤的话,就是表示存在SQL注入的漏洞,攻击方法并不完全是这样的!!!你那只是小耳科!!
      

  8.   

    呵呵,谢谢
    还以为存储过程可以避免SQL注入呢
    我书上或者资料上看到过的,为什么说的不一样呢
      

  9.   

    改成這樣
    CREATE PROCEDURE chekUser
    @ username varchar(20),
    @password varchar(20)
    AS
    DECLARE @pwd
    SELECT @pwd=isnull(password,'') FROM users    WHERE username=@username     
    IF (@pwd<>'' and @pwd==@password)
      RETURN 1
    ELSE
      RETURN -1這樣就隨便傳什麼非法字符都不要緊,
    不要將用戶和密碼一起驗證.
    GO
      

  10.   

    上面DECLARE @pwd改為
    DECLARE @pwd varchar(20)
      

  11.   

    楼上的
    你这句SELECT @pwd=isnull(password,'') 是认为用户不输入password ,则把password 的null值
    改成''吧。
    可是楼住的意思是输入这样一个东西
    ' or''='
    不是不输东西。
      

  12.   

    重寫一遍,經SQL 2000驗證可以通過CREATE PROCEDURE chekUser
    @ username varchar(20),
    @password varchar(20)
    AS
    DECLARE @pwd varchar(20)
    SELECT @pwd=password  FROM users    WHERE username=@username     
    IF (@pwd is null or  @pwd <> @password)
      RETURN FALSE
    ELSE
      RETURN TRUE
      

  13.   

    注意: 不要將用戶和密碼放在一條SQL語句里做驗證.
      

  14.   

    我的意思就是didoleo(冷月无声)所说的:证明一下用户名和密码放在存储过程验证是否' or''='
    可以进入,我知道直接放在应用程序中不安全,' or''='可以进入。
    另再加20分,晚上22直接:00前一定结贴。