用了参数化和存储过程还是有注入现象。
想到一个办法。大家看可行不可行?
用2个SQL用户分别给不同的权限。
打个比方:
A用户只能select,用在前台(也就是普通用户能看到的页面)。
而B用户能select,update,INSERT和Delete,用在后台管理页面(后台管理页面是要验证用户的)。这样可行不?

解决方案 »

  1.   

    用了参数化和存储过程还是有注入现象。
    在数据库系统本身没有bug的前提下(事实上你也几乎遇不到,可以视作没有),应该不会出现这样的情况。
      

  2.   

    但是实际情况就是发生了,所以我想请教下我上述的方法可行不?我的思路就是,你黑客不是要攻击吗,我就直接不给普通用户update,INSERT和Delete的权限。
      

  3.   

    注入的根源就是拼串,避免拼串采用参数传递,使其传递数据只当纯数据。楼上方法并不能避免注入,如果采用组串还是可以注入。不知道你说的注入是频繁添加程序,还是指的是程序bug.
      

  4.   


    你要找到问题的原因,重现这样的bug,比如说什么查询,什么用户输入下发生了攻击,如果你没有办法知道这一点,添加完备的日志先观察下。防止sql注入不能解决所有问题,还可能的攻击方式包括跨站攻击、脚本、上传漏洞、伪造用户身份等等。
      

  5.   

    你写过多少使用sql的程序?你的程序(普通用户)所运行的程序也没有修改数据库的代码吗?有吧!另外,只读数据库,就不是人家想看的么?如果让任何人随便看银行里所有其它客户的账户等等信息,这算不算泄密?这算不算被人入侵了系统呢?另外注入之后,例如我们可以去格式化硬盘,或者去获取服务器的登录账号和密码(或者偷偷设置一个),总之有一点功能就行了。谁说黑客都跟那些男脑子只有数据库表“增删改查”的人一个编程档次?
      

  6.   

    贴出你的存储过程来。特别是假设里边有exec执行字符串宏命令,那么这种存储过程尽量删除掉。
      

  7.   

    4楼所说的是sql注入的一个重要原因,为随便写个例子供楼主参考:
    DECLARE @_Sql NVARCHAR(4000);SET @_Sql='';
    DECLARE @_Name NVARCHAR(100);SET @_Name='甲醇'';SELECT ''看到我,表示注入成功''--';--使用EXEC SP_EXECUTESQL,动态sql方式,无法注入
    SET @_Sql='SELECT TOP 1 * FROM Product
        WHERE ProductName1 LIKE ''%''+@Name+''%'';';
    --此处用局部变量@_Name 替换了sql参数@Name,可以重复利用sql而不用担心参数命名的冲突
    --由于每次提交了相同的sql,只是参数不同,可以自动获得执行计划的性能优势
    EXEC SP_EXECUTESQL @_Sql,N'@Name NVARCHAR(100)',@_Name;--拼接方式,可以注入
    SET @_Sql='SELECT TOP 1 * FROM Product
        WHERE ProductName1 LIKE ''%'+@_Name+'%'';';
    --这里,由于每次提交的sql都不一样,无法利用sql执行计划的优势
    EXEC SP_EXECUTESQL @_Sql;
      

  8.   

    我之前网站也遇到SQL注入 后来采取的方式是 转化字符
      

  9.   

    Quote: 引用 9 楼 microtry 的回复:

    DECLARE @_Sql NVARCHAR(4000);SET @_Sql=''; DECLARE @_Name NVARCHAR(100);SET @_Name='甲醇'';SELECT ''看到我,表示注入成功''--';   --使用EXEC SP_EXECUTESQL,动态sql方式,无法注入 SET @_Sql='SELECT TOP 1 * FROM Product     WHERE ProductName1 LIKE ''%''+@Name+''%'';'; --此处用局部变量@_Name 替换了sql参数@Name,可以重复利用sql而不用担心参数命名的冲突 --由于每次提交了相同的sql,只是参数不同,可以自动获得执行计划的性能优势 EXEC SP_EXECUTESQL @_Sql,N'@Name NVARCHAR(100)',@_Name;   quote]
    这样改并不能完全避免注入,如果@_Name 传入 
    %' or 1=1  or ProductName1  like '% 
    仍然可以注入
    like换成charindex,改为:
    SET @_Sql='SELECT TOP 1 * FROM Product  WHERE charindex(@Name,ProductName1)>0 
      

  10.   

    同意8L。在存储过程中直接拼凑sql那你还“参数化”什么呢,其实有标准的做法,用QUOTENAME()去包装作为标识符的名称即可。
      

  11.   

    不能注入,你在参数中的任何内容都是参数,不会被解释成cmd的一部分,
    这也是动态(参数化)sql和拼接sql最大的区别,
    也是为什么这个语句可以放入执行计划的原因(而不是每次都要编译)
      

  12.   

    http://technet.microsoft.com/zh-cn/library/ms161953(SQL.105).aspx