从客户端中检测到有潜在危险的 Request.Form 值

  asp.net开发中,经常遇到“从客户端检测到有潜在危险的Request.Form 值”错误提示,是输入了<></>之类的字符,没等你的过滤条件检测,一提交就出错,可以在你当前页面添加Page_Error()函数来捕获所有页面处理过程中发生的而没有处理的异常。然后给用户一个合法的报错信息。也可以在Global.asax的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面呢。

  protected void Page_Error(object sender, EventArgs e)
        {
            Exception ex = Server.GetLastError();
            if (HttpContext.Current.Server.GetLastError() is HttpRequestValidationException)
            {
                HttpContext.Current.Response.Write("<a href=\"javascript:history.back(0);\">返回</a><br/><br/>请输入合法的字符串!");
                HttpContext.Current.Server.ClearError();
            }
        }

通常很多人给出的解决方案是:

1、web.config文档<system.web>后面加入这一句: <pages validaterequest="false"/>
示例:
<?xml version="1.0" encoding="gb2312" ?>
<configuration>
<system.web>
<pages validaterequest="false"/>
</system.web>
</configuration>

2、在*.aspx文档头的page中加入validaterequest="false",示例如下:
<%@ page validaterequest="false" language="c#" codebehind="index.aspx.cs" autoeventwireup="false" inherits="mybbs.webform1" %>

其实这样做是不正确的,会给程序安全带来风险,这是把检测攻击的功能关闭了除非是真的想要输入<>之类的字符,那么根据微软的建议,我们应该采取安全上称为“默认禁止,显式允许”的策略。

  首先,我们将输入字符串用 HttpUtility.HtmlEncode()来编码,将其中的HTML标签彻底禁止。

  然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。比如,我们希望有""标签,那么我们就将""显式的替换回""。

void submitBtn_Click(object sender, EventArgs e)
{
  //将输入字符串编码,这样所有的HTML标签都失效了。
  StringBuilder sb =new StringBuilder(HttpUtility.HtmlEncode(htmlInputTxt.Text));
  //然后我们选择性的允许<b> 和 <i>
  sb.Replace("&lt;b&gt;", "<b>");
  sb.Replace(
"&lt;/b&gt;", "</b>");
  sb.Replace(
"&lt;i&gt;", "<i>");
  sb.Replace(
"&lt;/i&gt;", "</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');">

原文地址:https://www.cnblogs.com/qfcndtt/p/2802603.html