【问题标题】:URL Routing, Image Handler & "A potentially dangerous Request.Path value"URL 路由、图像处理程序和“潜在危险的 Request.Path 值”
【发布时间】:2013-01-06 16:59:24
【问题描述】:

我已经遇到这个问题已经有一段时间了,并决定尝试通过在此处发布问题来一劳永逸地彻底解决问题。我在位于此处的 .net 4 网站中有一个图像处理程序:

https://www.amadeupurl.co.uk/ImageHandler.ashx?i=3604 (为保护隐私而删除了实际域)

现在这工作正常,从网络服务器提供图像没有问题,我说没有问题,因为如果我访问它工作正常的 URL,图像加载,不会生成异常。然而,昨天确实有人访问了这个确切的 URL,并引发了如下异常:

Exception Generated
Error Message:
A potentially dangerous Request.Path value was detected from the client (?).
Stack Trace:
at System.Web.HttpRequest.ValidateInputIfRequiredByConfig() at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context)

Technical Information:
DATE/TIME: 23/01/2013 03:50:01
PAGE: www.amadeupurl.co.uk/ImageHandler.ashx?i=3604

我理解错误消息,这不是问题我只是不明白为什么它会在这里生成,更糟糕的是我无法复制它,就像我说我点击图片加载的链接一样,没有例外.我正在使用 URL 路由并注册了要忽略的处理程序,以防这导致以下代码出现问题:

routes.Ignore("{resource}.ashx")

我不知道为什么我会收到错误或尝试什么。

【问题讨论】:

    标签: asp.net .net vb.net web-config httphandler


    【解决方案1】:

    Asp.Net 4.0+ 带有非常严格的内置请求验证,其中一部分是 url 中可能用于 XSS 攻击的潜在危险字符。以下是 url 中默认的无效字符:

    < > * % & : \ ?

    您可以在配置文件中更改此行为:

    <system.web>
        <httpRuntime requestPathInvalidCharacters="<,>,*,%,&,:,\,?" />
    </system.web>
    

    或返回 .Net 2.0 验证:

    <system.web>
        <httpRuntime requestValidationMode="2.0" />
    </system.web>
    

    一个非常常见的无效字符是%,所以如果有任何机会(攻击、网络爬虫或只是一些非标准浏览器)url 被转义,你会得到这个:

    www.amadeupurl.co.uk/ImageHandler.ashx/%3Fi%3D3604
    

    而不是这个:

    www.amadeupurl.co.uk/ImageHandler.ashx/?i=3604
    

    注意%3F? 的转义字符。 Asp.Net 请求验证器认为该字符无效并引发异常:

    A potentially dangerous Request.Path value was detected from the client (?).
    

    虽然在错误消息中您看到字符 (%3F) 的未转义版本,又是 ?

    Here's a good article 关于请求验证以及如何处理它

    【讨论】:

    • 感谢 Kamyar,读了一篇非常有见地的文章,我终于可以让这头野兽入睡了..
    • 使用 requestPathInvalidCharacters 时出现以下错误,请使用 requestPathInvalidCharacters="<,>,*,%,&,\,?"相反:字符“
    • @SteveA,这里用你说的,here
    • 我要补充一点,我收到此错误是因为我的请求是针对 example.com&request=param 而不是带有“?”的 example.com?request=param。愚蠢的错误:P
    • 有没有办法允许这些字符用于特定的控制器操作,而不是在站点范围内允许它?
    【解决方案2】:

    即使我遇到了这个问题,但对我来说,我不小心输入了 & 而不是 ?在网址中

    例如:

    example.com/123123&parameter1=value1&paameter2=value2

    但实际上它必须是:

    example.com/123123?parameter1=value1&paameter2=value2

    【讨论】:

      【解决方案3】:

      一个超级旧的线程,但这有效:

      return RedirectToAction("MyAction", new { @myParameterName = "MyParameterValue" });
      

      如果请求将发送到不同的控制器,您还可以在操作名称之后添加控制器名称,并且还可以添加更多查询字符串参数,只需在它们之间用逗号链接即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 1970-01-01
        • 2016-01-18
        • 2012-05-22
        相关资源
        最近更新 更多