正确处理带有百分号 url (/%) 的 IIS 请求

bka*_*aid 15 iis iis-7 iis-7.5

我正在寻找任何类型的解决方案来正确获取 IIS 请求,例如https://stackoverflow.com/%http://bing.com/%不显示 400 Bad Request 页面,而是显示自定义错误页面类似于http://google.com/%http://facebook.com/% 的做法(显然这些示例不在 IIS 上)。

我相信我已经尝试根据http://support.microsoft.com/kb/820129设置所有适用的 http.sys 注册表设置(AllowRestrictedChars、PercentUAllowed),但这并没有帮助。设置 AllowRestrictedChars 和自定义 400 页面具有固定的 url,例如https://stackoverflow.com/%12但不是 /%。

Sco*_*MVP 21

这在 IIS 内核级别被阻止。作为测试,我拉出IIS 中的每个模块,以便它甚至没有静态页面处理程序,但它仍然显示 400 错误消息。

我不相信 IIS 有可能解决这个问题。您提到的注册表设置适用于其他类型的受限字符。我还没有看到改变该功能的杠杆。

你的目标是避免这种情况?它打开了你的攻击面,我无法想象一个合法的访问者会因为阻止不完整的 URL 转义序列而丢失。

Update2: 这里有三个很棒的链接。由于围绕您的问题进行了讨论,IIS 团队的 Nazim Lala 和 Wade Hilmo 都在博客中讨论了这一点。Scott Hanselman 在 .NET 中的查询字符串部分也有一篇很棒的文章:

更新: 我咨询了 IIS 团队的一名成员以获得权威答案。他提到根据 RFC 1738 ( http://www.ietf.org/rfc/rfc1738.txt ) % 被认为是不安全的字符。

以下是相关文字:

不安全:

出于多种原因,字符可能不安全。空格字符是不安全的,因为当 URL 被转录或排版或经受文字处理程序的处理时,重要的空格可能会消失,并且可能会引入不重要的空格。字符“<”和“>”是不安全的,因为它们被用作自由文本中 URL 的分隔符;引号 (""") 用于在某些系统中分隔 URL。字符“#”是不安全的,应该始终进行编码,因为它在万维网和其他系统中用于从片段/锚点分隔 URL可能跟在它后面的标识符。 字符“%”是不安全的,因为它用于其他字符的编码。 其他字符是不安全的,因为网关和其他传输代理有时会修改这些字符。这些字符是“{”、“}”、“|”、“\”、“^”、“~”、“[”、“]”和“`”。

所有不安全的字符必须始终在 URL 中编码。例如,即使在通常不处理片段或锚标识符的系统中,字符“#”也必须在 URL 中编码,这样如果 URL 被复制到另一个使用它们的系统中,则无需更改网址编码。

因此,IIS 主动在核心级别阻止了这一点,这是一种主动安全措施,可最大程度地减少其攻击面。