目前我就是过滤一下单引号,上面提的都没听过,更别说用,我的系统肯定很不安全。好怕怕……

解决方案 »

  1.   

    注入能做到:
    1.字符型过滤单引号
    2.数值型判断是否为数值
    3.不使用动态拼sql串,也就是参数化(程序sqlcommand或动态拼sql时用sp_execute).
      

  2.   

    没弄明白什么是“参数化语句”, 也不知道什么是“拒绝包含二进制数据、转义序列和注释字符的输入内容”1、就是在你 的sql语句中尽量不要使用参数,这样的话能避免别人构造一些参数来进行注入。例如 id为1=1
    2、注释字符的含义就是别人构造一个 --,例如构造的密码为--,这样的话你的验证密码就无效了 ,已经被注释掉了
    3、其他的依次类推。
      

  3.   


    参数化最简单的例子是:
    不使用exec('sql串'),而使用sp_executesql在.net程序里不拼串,而是使用sqlcommand.
      

  4.   

    只要这符过滤了单引号,数值型做了判断,存储过程里没有动态拼sql串,那么"拒绝包含二进制数据、转义序列和注释字符的输入内容"也就无意义了。
      

  5.   

    参数化语句的意思 就是使用参数 不要把用户提交的内容(比如url参数)直接拿去做tsql运算
    打个比方
    你有一个叫uid的内容很常见的 诸如http://www.microsoft.com/page.asp?uid=1
    本来你是要查询uid=1的编号的内容
    你的后台当然是这样写的 select ... from ... where uid=request.querystring("uid") --针对asp而言,其他其实一样
    好了 请注意了 如果你不处理我的url 我可以构造一个url比如
    http://www.microsoft.com/page.asp?uid='1=1  xp_cmdshell  ''format c:'''
    我们看看你的sql执行什么
    select ... from ... where 1=1 xp_cmdshell 'format c:'
    因为1==1  tsql会执行下一句也就是格式化你的c盘
    当然以上文章是不考虑权限的情况下 不过sql注入就是这样的意思
    如果你改用参数化了 比如你写了个存储过程
    exec proc_uid @uid
    不管@uid你怎么构造 存储过程肯定返回错误 也就达到了你的目的了
    sql注入方式很多 以上这个是最老的一个了
    其实要避免还是很简单的 比如应用层和数据层之间加上中间层 专门用来构造sql语句,还有用存储过程也是一个办法
      

  6.   

    拒绝包含二进制数据、转义序列和注释字符的输入内容
    这个只是针对脚本攻击,一般是输入大量的二进制文本内容造成缓冲区溢出
    这个很难防范 其实也是现在防止tsql注入的新课题