从客户端检测到有潜在危险的Requert.From值--解决方案备忘
对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用输入影响页面返回结果的时候,ASP.Net的引擎会引发一个HttpRequestValidationExceptioin异常。
默认情况下会返回如下文字的页面:以下是引用片段:
ServerErrorin'/YourApplicationPath'Application ApotentiallydangerousRequest.Formvaluewasdetectedfromtheclient (txtName="<b>"). Description:RequestValidationhasdetectedapotentiallydangerousclientinputvalue,andprocessingoftherequesthasbeenaborted.Thisvaluemayindicateanattempttocompromisethesecurityofyourapplication,suchasacrosssitescriptingattack.YoucandisablerequestvalidationbysettingvalidateRequest=falseinthePagedirectiveorintheconfigurationsection.However,itisstronglyrecommendedthatyourapplicationexplicitlycheckallinputsinthiscase. ExceptionDetails:System.Web.HttpRequestValidationException:ApotentiallydangerousRequest.Formvaluewasdetectedfromtheclient(txtName="<b>"). ....
不考虑安全直接取消报警的方法:
解决方案一: 在.aspx文件头中加入这句:
<%@PagevalidateRequest="false" %>
MVC中在控制器ActionResult方法前加入[validateRequest=false]
解决方案二:修改web.config配置
<configuration> <system.web> <pagesvalidateRequest="false"/> </system.web> </configuration>
以前都在用上述两种方式处理,忽略了安全性的考虑,今天查了资料,有了新的解决方案.
防止XXS攻击,安全的解决办法
在当前页面添加Page_Error()函数,来捕获所有页面处理过程中发生的而没有处理的异常。然后给用户一个合法的报错信息。如果当前页面没有Page_Error(),这个异常将会送到Global.asax的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面。
在当前页面加入如下方法:
protected void Page_Error(objectsender,EventArgse) { Exceptionex=Server.GetLastError(); if(exisHttpRequestValidationException) { Response.Write("输入合法字符串。"); Server.ClearError();//如果不ClearError()这个异常会继续传到Application_Error()。 } }
这样可以截获HttpRequestValidationException异常,然后即可按照程序员的意愿给出相应的合理的错误提示,
如果只是需要异常处理,那么只需要写类似于上面的方法即可,最好不要随意禁止这个安全特性.
存在RichTextEditor富文本编译器的页面处理:
根据微软的建议,我们应该采取安全上称为“默认禁止,显式允许”的策略。
将输入的内容用HttpUtility.HtmlEncode()编码,彻底禁止HTML标签,然后在对感兴趣并且安全的标签用Replace()进行替换。
voidsubmitBtn_Click(objectsender,EventArgse) { //将输入字符串编码,这样所有的HTML标签都失效了。 StringBuildersb=newStringBuilder( HttpUtility.HtmlEncode(htmlInputTxt.Text)); //然后我们选择性的允许<b>和<i> sb.Replace("<b>","<b>"); sb.Replace("</b>",""); sb.Replace("<i>","<i>"); sb.Replace("</i>",""); Response.Write(sb.ToString()); }
如此一来,我们既允许了部分html标签,用禁止了不安全的标签。
微软提供的建议,我们要慎重允许下列HTML标签,因为这些HTML标签都是有可能导致跨站脚本攻击的。 以下是引用片段:
#<applet> #<body> #<embed> #<frame> #<script> #<frameset> #<html> #<iframe> #<img> #<style> #<layer> #<link> #<ilayer> #<meta> #<object>
//img标签 <img src="javascript:alert('hello');"> <img src="java
script:alert('hello');"> <img src="java
script:alert('hello');"> //style标签 <style type="text/javascript">... alert('hello'); </style>
看了这两个代码片段,确实要考虑网站安全性的问题,适时的对异常信息进行处理给出合理的提示信息,不能盲目的禁止这个安全特性.