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) 传入的查询条件,前后加括号。经过以上校验,应该基本可以保证参数是正常的参数,供大家参考。同时也希望大家能找出其中的漏洞,我可以进行改进^_^
最基本的,利用单引号攻击的,很容易解决,用类似于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) 传入的查询条件,前后加括号。经过以上校验,应该基本可以保证参数是正常的参数,供大家参考。同时也希望大家能找出其中的漏洞,我可以进行改进^_^
嗯,是啊,PreparedStatement可以很大程度上预防SQL注入。
我从来没有碰到过注入啊.
我从来没有碰到过注入啊.说的很对,这么写还提高的数据的执行效率。
引用楼主 windindance 的回复: ...
...
3 对于以上几种数据库操作的所有参数,例如select 操作中的 查询条件、排序条件等,都进行合法性校验:
a) 里面存在 "--" "/*" "*/" 的,都视为非法条件。
b) 将条件拆分为单词,如果存在以下单词:delete insert update exec execute create drop grant的,都视为非法条件。(正常的表名、字段名中不可能有上面这些关键字吧。)
c) 传入的查询条件,校验里面的括号,凡是右括号在左括号前面(不配对)的,都视为非法条件。
d) 传入的查询条件,前后加括号。
... 如果delete insert update exec execute create drop grant这些被视为非法的,那么这些文字怎么会出现在你的这个帖子里,又出现在CSDN上? 就是啊....
http://blog.joycode.com/scottgu/archive/2006/10/02/84561.joy
现在对一些疑问做答复:
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的文章很好,但还是不能处理动态查询条件。
a) 里面存在 "--" "/*" "*/" 的,都视为非法条件。
b) 将条件拆分为单词,如果存在以下单词:delete insert update exec execute create drop grant的,都视为非法条件。(正常的表名、字段名中不可能有上面这些关键字吧。)
c) 传入的查询条件,校验里面的括号,凡是右括号在左括号前面(不配对)的,都视为非法条件。
d) 传入的查询条件,前后加括号。 学习!
我也看到一个http://3jj.jxxhdn.com/jswz/sql/Mssql/2009-08-12/79.html