我有一个应用程序必须处理在其 URL 中获取“特殊”字符(如 &、+、% 等)。当我使用这些字符向应用程序发送请求时(当然我发送它们是转义的),我收到带有消息“ASP.NET 检测到 URL 中的无效字符”的“错误请求”响应代码。跟踪请求显示错误是从“身份验证模块”引发的。
我搜索了一下,发现每个页面都有一个 ValidateRequest 并将其值更改为 false 可以解决问题。不幸的是,我正在使用 Httphandler。有谁知道如何使用 http 处理程序停止请求验证?
我遇到了同样的问题(创建一个需要在 URL 中接收带有特殊字符的请求的 IHttpHandler)。我必须做两件事来修复它:
创建以下值为 1 的 DWORD 注册条目:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\VerificationCompatibility
在 web.config 中,将 requestFiltering 元素的 allowDoubleEscaping 属性设置为 true。
我遇到了同样的问题,并通过设置 validateRequest="false" 以及 requestValidationMode="2.0" 使其工作,如下所示。没有注册表编辑。
<system.web>
<httpRuntime requestValidationMode="2.0" />
...
<pages ... validateRequest="false" />
</system.web>
应用程序或机器级别的批发更改对我来说是不可接受的。我只有一个参数,客户端发送不正确,我需要清理。
我发现,当使用 html 或查询字符串中的其他潜在危险项发出请求时,您可以使用context.Request.RawUrl
清理字符串,一旦查询字符串被清理,请使用context.RewritePath(scrubbedUrl)
.
context.Request.RawUrl
context.RewritePath(srubbedUrl)
似乎请求验证只关心访问context.Request.Params[]
,所以如果你在访问 Params 集合之前擦洗并重写路径(到相同的路径),你就是黄金。
以下解决方案对我有用 - 创建以下值为 1 的 DWORD 注册条目:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\VerificationCompatibility
在 中web.config
,将元素的allowDoubleEscaping
属性设置为。requestFiltering
true
您可以删除所有模块
<httpModules>
<clear />
</httpModule>
使请求到达您的处理程序。或者,也许您可以删除阻止您的请求的特定模块。
这是在 ASP.NET 2.0 中从这里默认加载的模块列表
<httpModules>
<add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
<add name="Session" type="System.Web.SessionState.SessionStateModule" />
<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" />
<add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
<add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" />
<add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" />
<add name="Profile" type="System.Web.Profile.ProfileModule" />
</httpModules>
这个怎么样?
<system.web>
<pages validateRequest="false">
</pages>
</system.web>
从 .NET Framework 4.5 开始,您可以使用该Unvalidated
属性HttpRequest
或HttpRequestBase
以不会触发请求验证的方式访问表单、查询字符串和 URL 数据。如果您避免以任何其他方式访问这些值(包括在同一请求中运行的辅助方法或其他 HTTP 模块中),您将不需要其他任何东西来避免请求验证。
您可以在 web.config 的 pages 部分将 validateRequest 设置为 false。也许这也适用于 HttpHandlers?