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

本文探讨了ASP.NET中处理HttpRequestValidationException的最佳实践,强调了禁用validateRequest属性的安全风险,并提供了一种通过捕获异常来优雅地处理错误的方法。


由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值。立马报出“从客户端 中检测到有潜在危险的Request.Form值”这样的错。

   解决方案一: 
   在.aspx文件头中加入这句: 
   <%@ Page validateRequest="false" %>
eg:<%@ Page Language="C#" AutoEventWireup="false" ValidateRequest="false" CodeFile="你的页面.vb" Inherits="你的页面" %>

   解决方案二: 
   修改web.config文件: 
   <configuration> 
   <system.web> 
   <pages validateRequest="false" /> 
   </system.web> 
   </configuration> 
   因为validateRequest默认值为true。只要设为false即可。

 

 一般是这么解决得但是经过小灰得提醒

 这么解决得好

   转自http://www.svnhost.cn/Article/Detail-33.shtml 

 

asp.net开发中,经常遇到“从客户端检测到有潜在危险的Request.Form 值”错误提示,很多人给出的解决方案是:

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" %> 
 

其实这样做是不正确的,会给程序安全带来风险。

  ASP.Net 1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个 HttpRequestValidationExceptioin。这是ASP.Net提供的一个很重要的安全特性。因为很多程序员对安全没有概念,甚至都不知道XSS这种攻击的存在,知道主动去防护的就更少了。ASP.Net在这一点上做到默认安全。这样让对安全不是很了解的程序员依旧可以写出有一定安全防护能力的网站。

  但是,当我Google搜索 HttpRequestValidationException 或者 "A potentially dangerous Request.Form value was detected from the client"的时候,惊奇的发现大部分人给出的解决方案竟然是在ASP.Net页面描述中通过设置 validateRequest=false 来禁用这个特性,而不去关心那个程序员的网站是否真的不需要这个特性。看得我这叫一个胆战心惊。安全意识应该时时刻刻在每一个程序员的心里,不管你对安全的概念了解多少,一个主动的意识在脑子里,你的站点就会安全很多。

  为什么很多程序员想要禁止 validateRequest 呢?有一部分是真的需要用户输入"<>"之类的字符。这就不必说了。还有一部分其实并不是用户允许输入那些容易引起XSS的字符,而是讨厌这种报错的形式,毕竟一大段英文加上一个ASP.Net典型异常错误信息,显得这个站点出错了,而不是用户输入了非法的字符,可是自己又不知道怎么不让它报错,自己来处理报错。

  对于希望很好的处理这个错误信息,而不使用默认ASP.Net异常报错信息的程序员们,你们不要禁用validateRequest=false。

  正确的做法是在你当前页面添加Page_Error()函数,来捕获所有页面处理过程中发生的而没有处理的异常。然后给用户一个合法的报错信息。如果当前页面没有Page_Error(),这个异常将会送到Global.asax的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面呢。

  举例而言,处理这个异常其实只需要很简短的一小段代码就够了。在页面的Code-behind页面中加入这么一段代码:

   
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>】 " );
HttpContext.Current.Server.ClearError();
}
}

  这样这个程序就可以截获 HttpRequestValidationException 异常,而且可以按照程序员的意愿返回一个合理的报错信息。

  这段代码很简单,所以我希望所有不是真的要允许用户输入之类字符的朋友,千万不要随意的禁止这个安全特性,如果只是需要异常处理,那么请用类似于上面的代码来处理即可。

  而对于那些通过 明确禁止了这个特性的程序员,自己一定要明白自己在做什么,而且一定要自己手动的检查必须过滤的字符串,否则你的站点很容易引发跨站脚本攻击。

  关于存在Rich Text Editor的页面应该如何处理?

  如果页面有富文本编辑器的控件的,那么必然会导致有类的HTML标签提交回来。在这种情况下,我们不得不将validateRequest="false"。那么安全性怎么处理?如何在这种情况下最大限度的预防跨站脚本攻击呢?

  根据微软的建议,我们应该采取安全上称为“默认禁止,显式允许”的策略。

  首先,我们将输入字符串用 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');">


转自:http://www.cnblogs.com/UouHt/archive/2008/10/30/1322697.html

<think>我们正在处理的问题是:在 ASP.NET 中,使用 `HttpContextBase.Request.Form.Get()` 时,检测到有潜在危险Request.Form ,导致请求被拒绝。 这个问题通常发生在 ASP.NET 的请求验证机制(Request Validation)检测到用户输入中包含类似 HTML 或 JavaScript 的标记时,系统会认为这可能是一个跨站脚本攻击(XSS),从而抛出异常。错误信息通常为:“从客户端(......)中检测到有潜在危险Request.Form ”。 解决方案主要从几个方面考虑: 1. **全局禁用请求验证(不推荐)**:在整个应用程序中关闭请求验证,但这样会降低安全性。 2. **页面级禁用请求验证**:在特定页面(如Web Forms)通过设置 `ValidateRequest="false"` 来关闭请求验证。 3. **使用模型绑定并禁用验证特性**:在 MVC 中,可以在模型属性上使用 `[AllowHtml]` 特性,允许该属性接收 HTML 内容。 4. **使用 `HttpRequest.Unvalidated`**:在需要获取未经验证的表单数据时,使用 `Unvalidated` 集合绕过请求验证。 由于用户提到的是 `HttpContextBase.Request.Form.Get()`,我们可能是在一个较底层的环境中(可能是 MVC 中的自定义代码或者 Web API 等)。因此,我们重点考虑第四种方法:使用 `Unvalidated`。 具体步骤如下: ### 方法:使用 `HttpRequest.Unvalidated` 在 ASP.NET 4.0 及以上版本,`HttpRequest` 对象提供了 `Unvalidated` 属性,可以用于访问未经验证的表单数据、查询字符串等。 对于 `HttpContextBase`,我们可以通过 `HttpRequestBase` 的 `Unvalidated` 属性来获取。 示例代码: ```csharp // 假设我们有 HttpContextBase 实例 context string userInput = context.Request.Unvalidated.Form.Get("userInputField"); ``` 这样,即使 `userInputField` 包含 HTML 或 JavaScript 内容,也不会触发请求验证错误。 ### 注意事项 1. **安全性**:使用 `Unvalidated` 意味着绕过了 ASP.NET 的请求验证,因此你必须确保对获取的数据进行适当的编码或清理,以防止 XSS 攻击。 - 建议使用 AntiXSS 库(如 `System.Web.Security.AntiXss` 中的 `Encoder.HtmlEncode` 方法)对输出进行编码,或者使用 HTML 清理库(如 HtmlSanitizer)对输入进行清理。 2. **适用范围**:只应对确实需要接收 HTML 内容的字段使用 `Unvalidated`,而不是所有字段。 3. **其他替代方法**:如果你正在使用 ASP.NET MVC,并且是在控制器中处理表单,更推荐使用模型绑定配合 `[AllowHtml]` 特性。 - 在模型类中: ```csharp public class MyModel { [AllowHtml] public string RichText { get; set; } // 其他属性 } ``` - 在 Controller 中: ```csharp [HttpPost] public ActionResult Save(MyModel model) { // 直接使用 model.RichText,即使包含 HTML 也不会触发验证错误 } ``` ### 完整示例(使用 Unvalidated) ```csharp public ActionResult ProcessForm() { HttpContextBase context = new HttpContextWrapper(HttpContext.Current); // 获取未经验证的表单 string unvalidatedValue = context.Request.Unvalidated.Form.Get("key"); // 对进行清理(示例使用 HtmlSanitizer,需安装NuGet包) // 安装:Install-Package HtmlSanitizer var sanitizer = new HtmlSanitizer(); string safeHtml = sanitizer.Sanitize(unvalidatedValue); // 使用 safeHtml 进行后续操作 // ... return View(); } ``` ### 总结 解决 `HttpContextBase.Request.Form.Get()` 检测潜在危险的问题,核心在于绕过请求验证机制并确保安全处理用户输入。推荐使用 `Unvalidated` 方法获取原始,然后进行严格的编码或清理。 请根据实际需求选择合适的解决方案,并务必注意安全性。 --- §§相关问题§§ 1. 如何在 ASP.NET WebForms 中禁用请求验证? 2. 使用 `HttpRequest.Unvalidated` 获取数据时需要注意哪些安全问题? 3. 如何在 ASP.NET MVC 中全局禁用请求验证? 4. 如何对用户提交的 HTML 内容进行安全过滤? --- </think>### 解决 `HttpContextBase.Request.Form.Get()` 检测潜在危险的方法 当使用 `HttpContextBase.Request.Form.Get()` 时遇到 **"检测到有潜在危险Request.Form "** 错误,这表示 ASP.NET 的安全机制已阻止包含 HTML/JavaScript 等危险字符的表单提交。以下是系统的解决方案: --- #### **1. 禁用请求验证 (局部禁用)** 在需要接收 HTML 内容的页面(如富文本编辑器场景)添加指令: ```csharp // WebForms 页面 (.aspx) <%@ Page ValidateRequest="false" %> ``` ```csharp // MVC 控制器方法 (需配合特性) [ValidateInput(false)] public ActionResult SubmitRichText() { string htmlContent = Request.Form.Get("editorContent"); } ``` **注意**:仅用于特定已知安全的字段,禁用后需手动验证输入[^2]。 --- #### **2. 使用 `Unvalidated` 绕过安全检测** 避免触发验证机制,直接获取原始表单: ```csharp string rawValue = context.Request.Unvalidated.Form.Get("unsafeField"); ``` **安全性建议**: ```csharp // 安装 HtmlSanitizer 包: Install-Package HtmlSanitizer var sanitizer = new HtmlSanitizer(); string safeHtml = sanitizer.Sanitize(rawValue); // 过滤危险标签 ``` --- #### **3. 全局禁用请求验证 (不推荐)** 在 `web.config` 中全局关闭验证: ```xml <system.web> <pages validateRequest="false" /> </system.web> ``` **风险**:所有页面失去自动 XSS 防护,需全面手动过滤输入[^2]。 --- #### **4. 模型绑定 + `[AllowHtml]` 特性 (MVC 推荐)** 对特定模型属性允许HTML输入: ```csharp public class CommentModel { [AllowHtml] // 显式声明安全字段 public string Content { get; set; } } // 控制器 public ActionResult PostComment(CommentModel model) { string safeContent = model.Content; // 直接获取 } ``` --- ### **安全处理最佳实践** | 处理方式 | 适用场景 | 安全性风险 | |--------------------|---------------------------|------------| | 禁用页面验证 | 局部富文本输入 | 中 | | `Unvalidated` + 过滤 | 动态表单字段处理 | 低 | | `[AllowHtml]` | MVC 模型绑定 | 低 | | 全局禁用 | 遗留系统兼容 (不推荐) | 高 | **关键原则**: 1. 始终对输出内容编码:`@Html.Raw()` 仅用于可信内容 2. 使用 AntiXSS 库过滤: ```csharp using Microsoft.Security.Application; string safeOutput = Encoder.HtmlEncode(rawInput); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值