一、问题起因
最近项目中有一页面第一次search后正常,但是再次点击其它任何按钮都会报错,亦即postback后页面有问题,经检查是由于页面有一GridView且数据量极大,记录大概有上千条,这儿解释一下,本页面不允许分页要求所有的记录都要显示已方便使用,另你可能说为啥要用GridView啊?这也不是本文要讨论的问题。
经查,ASP.NET对postback是有限制的,确切地说是对postback后form上fields的集合大小的限制,默认大概1000,而我们这个页面仅仅Input, Select等就达到上千,所以才会造成页面出错即Operation is not valid due to the current state of the object.
二、问题解决
知道了原因,解决起来就容易了,如下在web.config中增加如下配置,把大小直接增加到5000
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="5000" />
</appSettings>
三、后续说明
虽然表面上解决了此问题,但是此方案风险极大,微软之所以在2月推出此更新MS11-100 (http://technet.microsoft.com/en-us/security/bulletin/ms11-100.This security update is rated Critical for Microsoft .NET Framework 1.1 Service Pack 1, Microsoft .NET Framework 2.0 Service Pack 2, Microsoft .NET Framework 3.5 Service Pack 1, Microsoft .NET Framework 3.5.1, and Microsoft .NET Framework 4 on all supported editions of Microsoft Windows) 是因为要避免HTTP POST Hash Collision Dos即Hash碰撞的拒绝服务攻击,此漏洞影响盛广,Java, Python, PHP, Ruby等无一幸免,当然ASP.NET也在受害之列.
攻击原理: 该安全弱点利用了各语言的Hash算法的“非随机性”可以制造出N多的value不一样,但是key一样数据,然后让你的Hash表成为一张单向链表,而导致你的整个网站或是程序的运行性能以级数下降(可以很轻松地让你的CPU升到100%)
Hash散列攻击: http://*.com/questions/8669946/application-vulnerability-due-to-non-random-hash-functions
http://www.cs.rice.edu/~scrosby/hash/CrosbyWallach_UsenixSec2003.pdf
PHP攻击版本实现:http://blog.csdn.net/linvo/article/details/7169718 (仅供参考)
解决方法:
- Restrict the number of POST parameters (限制请求数 – MS11-100干的就是这个事)
- Restrict the size of the POST request (限制请求大小)
- Web Application Firewall
四、参考链接