是否能够实现双重逃逸危险?

我有一个ASP.NET MVC应用程序的路线,允许通过/ search / <searchterm>search的东西。

当我提供“search/ abc”它运作良好,但是当我提供“/search/ A + B + C”(正确的URL编码),然后IIS7拒绝HTTP错误404.11 请求请求过滤模块configuration为拒绝请求包含一个双转义序列 )。 首先,为什么要这样做? 它似乎只是抛出错误,如果它是URL的一部分,但不作为查询string的一部分(/传输?q = a + b + c工作正常)。

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

有人可以解释并提供一些build议该怎么做?

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

基本上:IIS是过分偏执。 你可以安全地禁用这个检查,如果你没有做任何特别不明智的解码数据(例如通过string连接生成本地文件系统URI)。

要禁用检查,请执行以下操作(从这里或这里 ):(请参阅下面的注释,了解双重转义的含义)。

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

如果加号是searchinput中的有效字符,则需要启用“allowDoubleEscaping”以允许IIS处理来自URIpath的input。

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

你有没有想过像'/search/ A / B / C'的searchurl?

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

 search/{*path} 

然后从动作中的pathstring中提取search值。

HTHS
查尔斯

我只想在Eamon Nerbonne的答案中 join一些与你的问题的“ 做什么 ”部分有关的答案 (而不是解释原因)。
您也可以轻松更改特定应用程序的设置

  1. 用pipe理员权限打开控制台(开始 – cmd – 右键单击​​,以pipe理员身份运行)
  2. 在下面input(取自: 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 

    (例如,您可以使用Default Web SitereplaceYOURSITENAME将此规则应用于默认网站)

  3. input,准备好。

一个例子:

  1. 首先我有同样的问题: HTTP错误404.11  - 请求过滤模块配置为拒绝包含双转义序列的请求。
  2. 在上面提到的文字中键入: Drupal7,另一解决HTTP错误404.11  - 请求过滤模块被配置为拒绝包含双转义序列的请求。
  3. 现在它按预期工作: 解决HTTP错误404.11  - 请求过滤模块被配置为拒绝包含双转义序列的请求。

我在IIS 7.5下运行,在应用程序中执行Server.TransferRequest()。

编码文件名导致了双重转义的问题,但如果我没有编码它,那么我会遇到“潜在危险的Request.Path”错误。

把一个任何协议,甚至一个空的,我传递给Server.TranferRequest()解决了这个问题。

不起作用:

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

作品:

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