3

当我尝试运行论坛页面时:

System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client 

在我的 web.config 中,我有:

<pages validateRequest="false" smartNavigation="false">

在实际页面上,我还有:

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="false" MasterPageFile="~/MasterPages/Main.master" %>

但它一直抛出这个错误!

编辑

我修复了它:

<httpRuntime requestValidationMode="2.0" />

但那是做什么的,为什么它会起作用?

4

2 回答 2

5

提交的文本中可能有标记。http://www.asp.net/learn/whitepapers/aspnet4/break-changes

ASP.NET 中的请求验证功能为跨站点脚本 (XSS) 攻击提供了一定级别的默认保护。在以前版本的 ASP.NET 中,默认情况下启用请求验证。但是,它仅适用于 ASP.NET 页面(.aspx 文件及其类文件)并且仅在这些页面正在执行时才适用。

在 ASP.NET 4 中,默认情况下为所有请求启用请求验证,因为它在 HTTP 请求的 BeginRequest 阶段之前启用。因此,请求验证适用于所有 ASP.NET 资源的请求,而不仅仅是 .aspx 页面请求。这包括 Web 服务调用和自定义 HTTP 处理程序等请求。当自定义 HTTP 模块正在读取 HTTP 请求的内容时,请求验证也处于活动状态。

因此,以前未触发错误的请求现在可能会发生请求验证错误。要恢复到 ASP.NET 2.0 请求验证功能的行为,请在 Web.config 文件中添加以下设置:

<httpRuntime requestValidationMode="2.0" />
于 2011-03-13T16:47:03.723 回答
5

发生此错误是因为提交的表单或查询字符串中的某些内容看起来对 ASP.NET 中的验证很危险。

通过增加

<httpRuntime requestValidationMode="2.0" />

您正在放宽适用于 ASP.NET 2 标准的验证。

我会说你最好尝试在你的表单/查询字符串中准确地计算出它的对象,而不是仅仅放松验证。这种严格的验证是为了保护您和您的用户,不应轻易放松。

当我们升级到 ASP.NET MVC3(从版本 2)时,我最近在我正在处理的一个项目中遇到了这个问题。在我们的例子中,它实际上突出了一个问题,即我们在不打算对查询字符串进行 urlencoding 时(即,包括问号和 & 号在内的整个 quertstring 都在不应该进行 url 编码时进行了编码)。

不管你的原因是什么,如果可能的话,寻找根本原因而不是放松验证。

于 2011-03-13T16:54:52.233 回答