日期:2014-05-20  浏览次数:20359 次

【100分】关于Sql2005被注入的问题,如何防范?
最近网站经常被注入,数据库中的所有表的字符型字段都被加上“<script>....”,从网上查了资料,在Global.asax里也加入了防止一些“insert,update”的语句提交,并且发现时记入了我自己的日志文件,我做了测试,输入“insert”和“update”被成功的拦截,我以为可以防止注入了,今天早上一看,网站又被注入,日志文件根本没有记录到。
把程序中的所有代码都改成存储过程已经不现实了,太多了,还有没有什么能从根本上解决的办法?
删除库里的字段内容不太可能,频繁的备份还原数据库也不是长久之计。有什么办法能够看到是什么IP发出的这种攻击,用什么方式能拦截这些呢?还有从哪里能看IIS的日志?

我的数据库sql server 2005 站点就是Asp.net C#2.0开发的。IIS6, windows server2003

谢谢大家,分数不够再加!

------解决方案--------------------
看精华帖:
http://topic.csdn.net/u/20090729/14/26381958-0d6e-4b90-bc90-d275e9621f93.html
------解决方案--------------------
在一些带参数的的地方如id=100,在这些地方接受参数的时候用convert,一旦转换错误就去Error.aspx页面。、
攻击者看不到数据的信息。这样应该好些。
------解决方案--------------------
1,检查你的服务器环境,包括数据库是否有莫名用户
2,对你的应用进行检查,尤其是上传文件,最好能用干净的源文件替换,上传文件杀毒,有可能逐个检查
然后对代码进行检查,对输入参数过滤,检查跨域漏洞,查询用参数化查询等
然后重编译继续步骤1,2
------解决方案--------------------
一个传统的防止 SQL 注入攻击的方法是针对输入进行验证,要么只接受白名单
中的安全字符,要么鉴别和排除黑名单中的恶意字符。白名单是一种非常有效的
方法,虽然它需要执行严格的输入验证规则,但可以减少对参数化SQL 语句的
维护,并能够提供更高的安全保证。在大多数情况下,黑名单是充满漏洞的,并
不能有效地预防SQL 注入攻击。举个例子,攻击者可以:
1)把没有被黑名单引用的对象作为目标;
2)找到方法绕过需要排除的特殊字符;
3)利用存储程序存储过程隐藏注入的特殊字符;
手动排除输入到 SQL 查询中的字符是有用的,但它并不能保证你的应用程序不
受SQL 注入攻击。
另一个被提出的对付 SQL 注入攻击的常见方法是使用存储程序过程。尽管存储
程序过程能够防止一些类型的SQL 注入攻击,但仍有很多它不能预防。存储程
序过程通常通过限制作为参数的语句的类型来防止SQL 注入攻击。然而,有很
多方法可以绕过该限制,很多有意思的语句仍然能够传递给存储程序存储过程。
与黑名单一样,存储程序过程能够防止一些攻击,但它并不能保证你的应用程序
不受SQL 注入攻击。
------解决方案--------------------
SQL 注入错误发生在:
3) 输入程序的数据来自于不可信源。
4) 这些数据被用于动态构建 SQL 查询。
Example 1:下面的代码动态构建和执行一个SQL 查询,查找与给定名称匹配的
item。查询限定只有当当前用户名与item 的所有者名称匹配时,才向当前用户显
示item。
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
List items = sess.createSQLQuery(query).list();
...
代码中的查询原本希望执行如下语句:
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
然而,因为查询语