服务器无法将 %2b 识别为有效的图像路径

服务器无法将 %2b 识别为有效的图像路径

跑步IIS 7

我在共享主机账户上运行,我的服务器上有一个名为的文件,+.jpg但当我尝试通过 URL 导航到它时

   http://example.com/images/%2b.jpg

服务器没有正确响应,我的浏览器返回“未找到网页”错误。

在我的开发机器上,这工作正常。我应该告诉我的托管商启用什么选项,以便接受此类 URL?

答案1

看起来该问题是由双重转义序列引起的 404.11 错误:

HTTP 错误 404.11 - 未找到 请求过滤模块配置为拒绝包含双重转义序列的请求。

并详细说明知识库文章

运行此命令:

Appcmd set config "Default Web Site" /section:system.webServer/Security/requestFiltering -allowDoubleEscaping:True

允许提供文件。

对于您来说,您可以将此部分添加到应用程序的 web.config 中:

<requestFiltering allowDoubleEscaping="true" />

如本文所述TechNet 文章

答案2

加号 (+) 是每个RFC2396

许多 URI 包含由某些特殊字符组成或分隔的组件。这些字符被称为“保留字符”,因为它们在 URI 组件中的使用仅限于其保留用途。如果 URI 组件的数据与保留用途相冲突,则必须在形成 URI 之前对冲突的数据进行转义。

  reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                "$" | ","

Wade Hilmo 有一篇很棒的文章,标题为IIS 如何阻止 URL 中的字符。提供了很多信息和背景。具体针对加号的部分如下:

因此 allowDoubleEscaping/VerifyNormalization 看起来非常简单。为什么我说它会引起混淆?问题是当 URL 中出现“+”字符时。“+”字符似乎没有被转义,因为它不涉及“%”。此外,RFC 2396 将其标记为保留字符,当其为转义形式 (%2b) 时可以包含在 URL 中。但是,如果将 allowDoubleEscaping 设置为其默认值 false,我们将阻止它,即使以转义形式也是如此。这样做的原因是历史性的:早在 HTTP 的早期,“+”字符被认为是空格字符的简写。一些规范化器在给定包含“+”的 URL 时会将其转换为空格。因此,我们认为 URL 中的“+”是非规范的。我找不到任何引用 RFC 来调用这种“+”处理,但网络上有许多参考资料将其视为历史行为。

根据我自己的经验,我知道当 IIS 记录请求时,空格会被替换为加号。名称中包含加号可能会在解析日志时造成混淆。

有三种方法可以解决这个问题,还有两种方法可以继续使用加号。

  1. allowDoubleEscaping=true- 这将允许对整个网站/应用程序进行双重转义。根据内容的不同,这可能至少是不可取的。以下命令将设置allowDoubleEscaping=true

    appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /allowDoubleEscaping:True
    
  2. alwaysAllowedUrls- 请求过滤提供白名单方法。通过将该 URL 路径添加到 alwaysAllowedUrls,该请求将不会被任何其他请求过滤设置检查,并继续在 IIS 请求管道中运行。这里需要注意的是,请求过滤不会检查以下请求:

  • 请求限制:maxContentLength、maxUrl、maxQueryString
  • 动词
  • 查询 - 不会检查查询字符串参数
  • 双重转义
  • 高位字符
  • 请求过滤规则
  • 请求标头限制

以下命令将添加/+.jpgalwaysAllowedUrls默认网站。

    appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"alwaysAllowedUrls.[url='/+.jpg']"
  1. 改名- 是的,如果可能的话,只需重命名文件/文件夹。这是最简单的解决方案。

相关内容