------解决方案-------------------- 根据流行的注入工具来加强自己的系统
------解决方案--------------------
什么都被你浅析了呀!! 注入,词面上的含义也是他实质的意义.很多文章都介绍得很好,从原理到综合利用,由浅入深. 个人理解注入的灵魂就在于构造,而防范就在于防止存在这种机会的可能性.而构造是基于sql语句自身的特点和程序中生成语句的方法.不恰当的方法就给构造造成了更多的机会.很多实例在网络文章中多有介绍.而多数的注入工具是基于这些特点利用程序的报错信息来暴库的. 下面举出部分例子(主要对sqlserver;access由于不支持多句,注入暴库方法更繁琐,相对更安全一些) 程序中sql="select * from eg where id="& request("id")期望生成的语句是:select * from eg where id=1这样的形式结果当request("id")取值为 1;drop table eg;这时实际的语句就是:select * from eg where id=1;drop table eg; eg表被删除了 程序中sql="select * from eg where idno='"& request("idno") &"'"期望生成的语句是select * from eg where idno='test'这样的形式结果当request("idno")取值为 test';drop table eg;-- 这时实际的语句就是select * from eg where idno='test';drop table eg;--' eg表被删除了 程序中sql="select * from eg where id in ("& request("id") &")"期望生成的语句是select * from eg where id in (1,2,3)这样的形式结果当request("id")的值为1,2,3);drop table eg;--这时实际的语句就是select * from eg where idno in (1,2,3);drop table eg;--) eg表被删除了 ......具体语句不一样构造方法有些差异,但机会都是程序给的
------解决方案--------------------
对不通的语句和获取的参数做策略调整 正常的: update mytable set mydata='i''ll update data' 没处理的 sql="update mytable set mydata='"& request("mydata") &"'" 参数是i'll update data,这里会报错了;成了 update mytable set mydata='i'll update data' 处理一下 sql="update mytable set mydata='"& replace(request("mydata"),"'","''") &"'" 就好了
正常的 update mytable set mydata='i will update data' 没处理的 sql="update mytable set mydata='"& request("mydata") &"'" 正常的参数i will update data,尝试注入i will update data';drop table mytable;-- 没处理的语句就是 update mytable set mydata='i will update data';drop table mytable;--'