3

我有一个应用程序必须处理在其 URL 中获取“特殊”字符(如 &、+、% 等)。当我使用这些字符向应用程序发送请求时(当然我发送它们是转义的),我收到带有消息“ASP.NET 检测到 URL 中的无效字符”的“错误请求”响应代码。跟踪请求显示错误是从“身份验证模块”引发的。

我搜索了一下,发现每个页面都有一个 ValidateRequest 并将其值更改为 false 可以解决问题。不幸的是,我正在使用 Httphandler。有谁知道如何使用 http 处理程序停止请求验证?

4

8 回答 8

2

我遇到了同样的问题(创建一个需要在 URL 中接收带有特殊字符的请求的 IHttpHandler)。我必须做两件事来修复它:

  1. 创建以下值为 1 的 DWORD 注册条目:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\VerificationCompatibility

  2. 在 web.config 中,将 requestFiltering 元素的 allowDoubleEscaping 属性设置为 true。

于 2009-01-28T01:28:20.003 回答
2

我遇到了同样的问题,并通过设置 validateRequest="false" 以及 requestValidationMode="2.0" 使其工作,如下所示。没有注册表编辑。

<system.web>
  <httpRuntime requestValidationMode="2.0" />
  ...
  <pages ... validateRequest="false" />
</system.web>
于 2010-06-23T09:40:18.133 回答
2

应用程序或机器级别的批发更改对我来说是不可接受的。我只有一个参数,客户端发送不正确,我需要清理。

我发现,当使用 html 或查询字符串中的其他潜在危险项发出请求时,您可以使用context.Request.RawUrl清理字符串,一旦查询字符串被清理,请使用context.RewritePath(scrubbedUrl).

  1. 处理程序中的第一件事,获取context.Request.RawUrl
  2. 清除错误的请求 RawUrl 以获取错误的输入
  3. context.RewritePath(srubbedUrl)
  4. 利润

似乎请求验证只关心访问context.Request.Params[],所以如果你在访问 Params 集合之前擦洗并重写路径(到相同的路径),你就是黄金。

于 2011-10-13T15:37:55.350 回答
1

以下解决方案对我有用 - 创建以下值为 1 的 DWORD 注册条目:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\VerificationCompatibility

在 中web.config,将元素的allowDoubleEscaping属性设置为。requestFilteringtrue

于 2010-05-04T11:06:07.127 回答
0

您可以删除所有模块

<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>
于 2008-11-13T15:43:51.400 回答
0

这个怎么样?

<system.web>
    <pages validateRequest="false">
    </pages>
</system.web>
于 2008-11-19T03:59:14.440 回答
0

从 .NET Framework 4.5 开始,您可以使用该Unvalidated属性HttpRequestHttpRequestBase以不会触发请求验证的方式访问表单、查询字符串和 URL 数据。如果您避免以任何其他方式访问这些值(包括在同一请求中运行的辅助方法或其他 HTTP 模块中),您将不需要其他任何东西来避免请求验证。

于 2018-02-21T16:14:18.373 回答
-1

您可以在 web.config 的 pages 部分将 validateRequest 设置为 false。也许这也适用于 HttpHandlers?

于 2008-11-13T14:34:44.333 回答