从客户端检测到有潜在危险的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("&lt;b&gt;","<b>");
sb.Replace("&lt;/b&gt;","");
sb.Replace("&lt;i&gt;","<i>");
sb.Replace("&lt;/i&gt;","");
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&#010;script:alert('hello');">
<img src="java&#X0A;script:alert('hello');">

//style标签
<style type="text/javascript">...
alert('hello');
</style>

看了这两个代码片段,确实要考虑网站安全性的问题,适时的对异常信息进行处理给出合理的提示信息,不能盲目的禁止这个安全特性.

原文地址:https://www.cnblogs.com/aaronguo/p/2836648.html