是否允许双重逃逸危险?

时间:2009-09-21 07:19:43

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

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

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

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

有人可以解释并提供一些建议吗?

4 个答案:

答案 0 :(得分:149)

编辑: 为相关部分增加了重点。

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

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

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

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

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

答案 1 :(得分:2)

您是否考虑过将搜索网址设为'/ search / a / b / c'?

您需要设置类似

的路线
search/{*path}

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

HTHS
查尔斯

答案 2 :(得分:2)

我只想 添加 一些与{<3>要做的事情>部分相关的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. 输入,准备好了。
  4. 一个例子:

    1. 首先我遇到了同样的问题: HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.
    2. 输入上述文字: Drupal7-another Solution to HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.
    3. 现在按预期工作: Solution to HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.

答案 3 :(得分:0)

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

编码文件名会导致双重转义问题,但如果我没有编码,那么我会遇到"potentially dangerous Request.Path"错误。

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

不起作用:

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

使用:

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