BS系统中,传统的注入攻击手段有很多。
最基本的,利用单引号攻击的,很容易解决,用类似于QuotedStr()(实际开发是其他语言,这里用DELPHI中的函数代替)的函数处理参数即可。
但实际应用中,不可避免会有一些应用需要直接传递参数,例如表名、查询条件、排序条件等等
对这些应用的注入攻击防不胜防。
我考虑了一个思路,供大家参考。1 对所有网页传入的参数分三种。
  a) 数字类型,用StrToInt函数处理。
  b) 字符串类型,用QuotedStr函数处理。
  c) 需要直接传递的参数,这是需要着重考虑的类型。2 对所有数据库操作主要分五种,不允许程序直接执行SQL语句:
  a) select 查询
  b) update 更新
  c) insert 新增
  d) delete 删除
  e) exec 执行存储过程3 对于以上几种数据库操作的所有参数,例如select 操作中的 查询条件、排序条件等,都进行合法性校验:
  a) 里面存在 "--" "/*" "*/" 的,都视为非法条件。
  b) 将条件拆分为单词,如果存在以下单词:delete insert update exec execute create drop grant的,都视为非法条件。(正常的表名、字段名中不可能有上面这些关键字吧。)
  c) 传入的查询条件,校验里面的括号,凡是右括号在左括号前面(不配对)的,都视为非法条件。
  d) 传入的查询条件,前后加括号。经过以上校验,应该基本可以保证参数是正常的参数,供大家参考。同时也希望大家能找出其中的漏洞,我可以进行改进^_^

解决方案 »

  1.   

    如果执行前能分析、分解sql,得出它是哪些操作命令,就能发现非预期的操作命令了
      

  2.   

    windindance已经好久没有看到身影了!
      

  3.   

    我一般都用PreparedStatement,这样在一定程度上可以预防sql注入式攻击我想知道对PreparedStatement和存储过程这两种方式怎么实施注入式攻击
      

  4.   


    嗯,是啊,PreparedStatement可以很大程度上预防SQL注入。
      

  5.   

    用java做,编程规范一点,不用考虑这个问题
      

  6.   

    如果delete insert update exec execute create drop grant这些被视为非法的,那么这些文字怎么会出现在你的这个帖子里,又出现在CSDN上?
      

  7.   

    过滤特殊字符,运用预存储执行sql不要直接执行sql
      

  8.   

    转义XX了,把注入语句写成ASCII码怎么办?
      

  9.   

    可以参考下 Mysqlids 80sec推出的,个人感觉直接检测SQL 语句是最安全的,同时对所有传入的数据进行类型和长度检测,内部传入数据可以加密传入,然后严格的防范表单提交和搜索提交的数据,防范可以参考formhash.
      

  10.   

    insert into t_users(u_name,u_pswd,u_key) values(?,?,?)用COMMAND对象将?值放进去,
    我从来没有碰到过注入啊.
      

  11.   

    insert into t_users(u_name,u_pswd,u_key) values(?,?,?) 用COMMAND对象将?值放进去, 
    我从来没有碰到过注入啊.说的很对,这么写还提高的数据的执行效率。
      

  12.   

    尽量使用预编译语句(一般语言都有类似的api吧),减少或不使用拼接SQL的方式
      

  13.   

    引用 24 楼 achilleswar 的回复:
    引用楼主 windindance 的回复: ... 
    ... 
    3 对于以上几种数据库操作的所有参数,例如select 操作中的 查询条件、排序条件等,都进行合法性校验: 
      a) 里面存在 "--" "/*" "*/" 的,都视为非法条件。 
      b) 将条件拆分为单词,如果存在以下单词:delete insert update exec execute create drop grant的,都视为非法条件。(正常的表名、字段名中不可能有上面这些关键字吧。) 
      c) 传入的查询条件,校验里面的括号,凡是右括号在左括号前面(不配对)的,都视为非法条件。 
      d) 传入的查询条件,前后加括号。 
    ... 如果delete insert update exec execute create drop grant这些被视为非法的,那么这些文字怎么会出现在你的这个帖子里,又出现在CSDN上? 就是啊....
      

  14.   

    Scott Guthrie写过一篇,值得参考技巧和诀窍:防范SQL注入攻击  
    http://blog.joycode.com/scottgu/archive/2006/10/02/84561.joy
      

  15.   

    没想到这么多楼了……感谢大家关注。
    现在对一些疑问做答复:
    1 这只是一种设计思路,不局限于语言。用PreparedStatement等方法,不同语言的实现不同,也可能有一些语言不支持这些方法。2 PreparedStatement 可以用于执行存储过程,比较难以注入。但是用这种方法只能做一些固定的查询,如果要做灵活的查询(比如要动态选择查询的字段)就很难处理。这个架构主要也就是针对灵活查询而设计的。3 “delete insert update exec execute create drop grant”这些数据,如果是放在INSERT 或 UPDATE 语句中是不会有问题的,因为对每个INSERT/UPDATE的值都会用QuotedStr函数处理。
      而对于查询,对于一个正常的查询条件来说,不太可能出现这些关键字。
      举例: update t set field a='delete ***' where id=1 是合法的。
      而 select * From  t where id=1 delete t 是非法的。http://blog.joycode.com/scottgu/archive/2006/10/02/84561.joy的文章很好,但还是不能处理动态查询条件。
      

  16.   

    BS结构防止SQL注入基本上是两个方面要做好。一个是设置弄好。另一方面就是代码的安全性。如果做好这两点基本能防止大多数的SQL注入。代码的静态分析和软件测试要做好。其实配置方面是最难的,应为你不知道它是不是有未知漏洞如果有漏洞的话代码在安全也是防不住的。
      

  17.   

    对于以上几种数据库操作的所有参数,例如select 操作中的 查询条件、排序条件等,都进行合法性校验: 
      a) 里面存在 "--" "/*" "*/" 的,都视为非法条件。 
      b) 将条件拆分为单词,如果存在以下单词:delete insert update exec execute create drop grant的,都视为非法条件。(正常的表名、字段名中不可能有上面这些关键字吧。) 
      c) 传入的查询条件,校验里面的括号,凡是右括号在左括号前面(不配对)的,都视为非法条件。 
      d) 传入的查询条件,前后加括号。 学习!
      

  18.   

    不错 挺全的 
    我也看到一个http://3jj.jxxhdn.com/jswz/sql/Mssql/2009-08-12/79.html
      

  19.   

    谢谢  正好 出现SQL注入
      

  20.   

    还有人中招呀,所有参数均不直接采用sql语句拼接,而是采用参数传递,一点事都没得