公司的网站使用ASP.NET2.0+SQL2000做的,这几天老受sql注入攻击,数据库中80%的表字段类型为text的内容都被<script src=http://252a.cn/1.js></script>这样的木马代码给覆盖了,我在Global.asax文件中加了过滤特殊字符的代码,如把像;|-|select|insert|delete|from|drop table|update|truncate|xp_cmdshell|exec master|netlocalgroup administrators|:|net user|""|or|and这样的字符都过滤掉了还是不行,请问各位关于sql注入攻击有没有什么好的防御方法,我用触发器试了下,但好像对text这样类型的字段不管用,而我数据库中有关内容显示的都是用的text类型,
如果可以该程序的话,最好改成使用参数SQL,如果不想改程序的话,你可以看一下我这篇blog:
http://www.cnblogs.com/killkill/archive/2009/02/26/1398524.html
不过正则表达式需要改成:
.*((;.*update(\s|\*/|/\*).*\w+.*(\s|\*/|/\*)set(\s|\*/|/\*).+=.+)|(;.*delete(\s|\*/|/\*).*from(\s|\*/|/\*).+\w+)|(.*select(\s|\*/|/\*).*\w+.*(\s|\*/|/\*)from(\s|\*/|/\*).*)|(;.*(drop|alter|truncate|create)(\s|\*/|/\*).*table(\s|\*/|/\*).*\w+)|(;.*declare.*cursor.*)|(;.*declare.*set.*exec.*)).*
这种类型攻击不一定是诸如,或者说注入的可能性很小···
我们也碰到过这种问题··
后来查明原因是机房受到内部ARP病毒影响···还有挂马攻击··
仅作参考·
Web.Config中:
<?xml version="1.0" encoding="gb2312" ?>
<configuration>
<system.web>
<pages validaterequest="true"/>
</system.web>
</configuration>
然后在特定的你需要输入“<>”一类字符的页面头部声明:
<%@ page validaterequest="false" language="c#" codebehind="index.aspx.cs" autoeventwireup="false" inherits="mybbs.webform1" %>
这样你可以全面屏蔽此类输入,并且可以在后台关闭这种验证,以实现一些管理员的输入操作。
当然,最好的办法还是改写一下你的数据库访问代码,使用参数化的SQL命令访问数据库。
你的sql全部用存储过程,而不用拼起来的sql语句,这是最正确的解决方案
此外,页面添加验证码。还有查一下网站目录有没有残留的木马
这是利用Sql加密数据进行的新注入方式,你可以过滤%也可以过滤DEclare
sql语句用存储过程
查看iis日志,确定是否是sql注入。如果是注入,关闭网站的错误提示,修补程序漏洞(试试用httpmodule或者在global中拦截客户请求)。
如果是arp,在server上安装arp防火墙,比如360安全卫士,然后开启360的arp防火墙。
Global.asax怎么过滤的?
如果网站规模不大,就改每个文本框的输入字段的过滤,用正则表达式把<和>替换成<>就行了。
如果网站规模很大,全部改有困难,就改数据访问层代码,把所有字符型数据都过滤一遍。
建议增加日志功能,把攻击者的IP查出来,配合警方打击攻击者。
以前就听说这个东西很恐怖,做网站时,都用的存储过程!
防止sql注入,所有的数据操作的方法,用存储过程。ok
检查每个Request
数字的用int.Parse
字符串的要过滤,建议用下面这个:
public static string InputText(string text, int maxLength)
{
if (!string.IsNullOrEmpty(text))
{
text = text.Trim();
if (text.Length > maxLength)
{
text = text.Substring(0, maxLength);
}
text = Regex.Replace(text, "[\\s]{2,}", " "); //two or more spaces
text = Regex.Replace(text, "(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?>)", "\n"); //<br>
text = Regex.Replace(text, "(\\s*&[n|N][b|B][s|S][p|P];\\s*)+", " "); //
text = Regex.Replace(text, "<(.|\\n)*?>", string.Empty); //any other tags
text = text.Replace("'", "‘");
return text;
}
else
{
return string.Empty;
}
}
SQL语句最好还是参数化吧,另外多用存储过程。