【问题标题】:Is Enabling Double Escaping Dangerous?启用双重转义是否危险?
【发布时间】:2010-11-30 00:10:20
【问题描述】:

我有一个 ASP.NET MVC 应用程序,其路由允许通过 /search/ 搜索内容。

当我提供“search/abc”时,它运行良好,但是当我提供“/search/a+b+c”(正确的 url 编码)时,IIS7 拒绝请求并显示 HTTP 错误 404.11(请求过滤模块配置为拒绝包含双转义序列的请求)。首先,它为什么要这样做?如果它是 URL 的一部分,而不是作为查询字符串的一部分,它似乎只会引发错误( /transmit?q=a+b+c 可以正常工作)。

现在我可以在 web.config 的安全部分启用双重转义请求,但我犹豫是否这样做,因为我不明白其中的含义,也不知道为什么服务器会拒绝请求“a+b+ c" 作为 URL 的一部分,但接受作为查询字符串的一部分。

有人可以解释并给出一些建议吗?

【问题讨论】:

  • 我还尝试了调用 Server.UrlPathEncode 的可能更正确的选项,并在标记中以 /search/a%2520b%2520c 结束,这导致了一个可爱的“A可能从客户端检测到危险的 Request.Path 值 (%)”错误。看来你赢不了。

标签: c# asp.net-mvc iis-7


【解决方案1】:

编辑:强调相关部分。

基本上:IIS 过于偏执。如果您没有对 uri 解码的数据做任何特别不明智的事情(例如通过字符串连接生成本地文件系统 URI),则可以安全地禁用此检查。

要禁用检查,请执行以下操作(来自here):(有关双重转义的含义,请参阅下面的评论)。

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

如果加号是搜索输入中的有效字符,则需要启用“allowDoubleEscaping”以允许 IIS 处理来自 URI 路径的此类输入。

最后,一个非常简单但有限的解决方法就是避免使用“+”而使用“%20”。 无论如何,使用“+”符号对空格进行编码不是有效的 url 编码,但特定于一组有限的协议,并且可能广泛支持向后兼容原因。如果仅出于规范化目的,您最好将空格编码为 '%20' ;这很好地回避了 IIS7 问题(对于其他序列,如 %25ab,仍然会出现该问题。)

【讨论】:

  • 我会禁用检查。这很麻烦,并且不会为大多数应用程序提供额外的安全性。
  • 您是否有链接/参考说明禁用双重转义非常安全?另外,这种安全措施究竟能防止发生什么?
  • 如果 uri 是双转义的,那么未转义的 uri 组件可能本身包含保留字符,因此(部分)未转义的 uri 本身可能是有效的 uri。简而言之,如果您使用未转义的 uri 字符串来构造新的 uri - 特别是文件系统路径 - 并且您未能正确转义新路径,则可能允许路径注入。路径注入可能允许攻击者欺骗您的程序来处理它不应该处理的数据,或者让它混淆它以为两个 uri 实际上是相同的但只是编码不同的不同。
  • @Stijn:是的:这很安全。所有这些检查都是过滤掉可能被错误代码误解的请求(尤其是如果您通过字符串连接进行双重解码或构建 Uri 并且没有正确编码)。你没有做任何类型的处理,所以这对你来说几乎是自动安全的。任何错误都需要在 IIS 的基本文件服务代码中,我认为我们可以放心地假设现在已经非常非常彻底地进行了战斗测试。同样,这个检查并不花哨,它只是对可能被解码然后看起来像一个编码 uri的东西保释。
【解决方案2】:

我只想向Eamon Nerbonne's answer添加一些与您问题的“做什么”部分相关的信息(不是解释原因)。
您也可以使用

轻松更改特定应用程序的设置
  1. 使用管理员权限打开控制台(开始 - cmd - 右键单击​​,以管理员身份运行)
  2. 输入以下内容(取自这里:http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true
    

    (例如,您可以将 YOURSITENAME 替换为 Default Web Site 以将此规则应用于默认网站)

  3. 进入,准备就绪。

一个例子:

  1. 首先我遇到了同样的问题:
  2. 输入上述文本:
  3. 现在它按预期工作:

【讨论】:

    【解决方案3】:

    您是否考虑过使用类似“/search/a/b/c”的搜索 URL?

    你需要设置一个类似的路线

    search/{*path}
    

    然后从动作中的路径字符串中提取搜索值。

    HTH
    查尔斯

    【讨论】:

    • 问题是其他 URL 编码字符(包括 '/' 本身)可能是搜索的一部分。
    • 你能不能把所有实际上是搜索一部分的“/”编码为“%2F”?
    【解决方案4】:

    我在 IIS 7.5 下在应用程序中执行 Server.TransferRequest() 时遇到了这个问题。

    对文件名进行编码会导致双重转义问题,但如果我不对其进行编码,则会遇到"potentially dangerous Request.Path" 错误。

    在我传递给 Server.TranferRequest() 的 URL 上放置一个 any 协议,甚至是一个空协议,解决了这个问题。

    不起作用:

    context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");
    

    作品:

    context.Server.TransferRequest("://folder/bar%20bar.jpg");
    

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 2019-11-28
      • 2017-08-21
      • 2013-07-24
      • 2016-01-28
      • 2019-07-10
      • 2023-04-03
      • 2023-04-07
      • 2011-10-24
      相关资源
      最近更新 更多