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


14

我正在寻找任何一种解决方案来正确获取IIS请求,例如/programming//%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,例如/programming//%12,但没有/%。


3
您意识到这是一个不完整的URL转义,并且是一个错误的请求,因此400是否可以正确处理它?PercentU和AllowRestricted并不是真正适用
Rup

是的,我愿意(和/%只是一个示例URL,但是显然,每个无效的转义字符都会发生错误)。IIS是处理400,但我想显示自定义400页就像我可以在IIS中的其他状态代码,以及怎么样非IIS服务器可以为400
bkaid

我有一些指向我的网站的强大链接,这些链接被错误地编码为这样。但是我不允许将它们301显示在正确的页面上,相反,这是一个很难的错误。这是无法接受的。
boomhauer 2012年

Answers:


20

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

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

您的目标是避免这种情况?它可以更广泛地打开您的攻击面,而且我无法想象由于阻止不完整的URL转义序列而导致合法访问者迷失了。

Update2: 这是这方面的三个重要链接。IIS小组的Nazim Lala和Wade Hilmo都在博客上写了这个,因为围绕您的问题进行了讨论。此外,Scott Hanselman在.NET中的querystring部分上也有一篇很不错的文章:

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

这是相关的文本:

不安全:

出于多种原因,字符可能是不安全的。空格字符是不安全的,因为在对URL进行转录或排版或对文字处理程序进行处理时,可能会消失大量空格并且可能会引入无关紧要的空格。字符“ <”和“>”是不安全的,因为它们被用作自由文本中URL的分隔符。在某些系统中,使用引号(“”“)来分隔URL。字符”#“是不安全的,并且应始终进行编码,因为在万维网和其他系统中,该字符用于分隔片段/锚定中的URL。标识符可能会遵循它。 因为它用于其他字符的编码字符“%”是不安全的。 其他字符是不安全的,因为已知网关和其他传输代理有时会修改此类字符。这些字符是“ {”,“}”,“ |”,“ \”,“ ^”,“〜”,“ [”,“]”和“`”。

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

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


我宁愿自己适当地记录并处理所有错误,以监视在我的网站上动态生成的无效url的任何无效奇怪组合,以防万一没有正确地转义url。
bkaid 2011年

1
可以自己说些什么来处理错误,但是如果为您处理了明显的故障,那将是一个不错的选择。IIS不允许不与NTFS文件系统中的文件或文件夹相对应的字符通过。它不知道如何处理文件夹路径。如果不是等于有效字符的字符模式,则需要决定该怎么做。在这种情况下,似乎专用于阻止而不是忽略无效字符。
Scott Forsyth-MVP

@thekaido正如Scott所说,解析不完整的URL没有任何意义。由于您不知道用户要执行的操作(因为请求不完整),因此您可以创建哪种自定义错误页面。请注意,IE9甚至不会让您以不完整的请求进入服务器
Jim B

我了解所有这些方面的含义,但是Apache和其他Web服务器以及IIS都允许这样做。不正确的转义URL是IIS无法让您处理的唯一URL。IIS应该并且确实允许其他不映射到NTFS文件系统的字符,因为我的网站是使用ASP.NET MVC构建的,其中请求将被路由到非基于文件的资源。
bkaid 2011年

实际上,我对NTFS中的%表示正确。允许使用,以及其他大多数字符:en.wikipedia.org/wiki/Ntfs。(在文件名中搜索允许的字符)。
Scott Forsyth-MVP

3

我可以想到3种可能的方式

  1. 将IIS更改为指向自定义页面,以解决400个错误

  2. 如果这对于IIS中的特定网站是唯一的,则可以在web.config中执行以下操作:

    <customErrors defaultRedirect =“ ErrorPage.aspx” mode =“ On”>
    <错误statusCode =“ 400” redirect =“ myCustom400Error.aspx” />
    </ customErrors>

  3. 编写一个httpModule来检查传入的URL并处理它们


4
这些都不起作用-IIS从不传递请求。
bkaid 2011年

选项#1无论如何都应该起作用,因为那是IIS对错误的响应方式
Dave Wise

4
我只是再次尝试了选项1和#2,但它们都不起作用。IIS特别像Scott提到的那样处理此请求。
bkaid 2011年

3

解决此问题的唯一方法听起来像是在IIS内核之前检查URL。

您需要通过脚本发送动态生成的链接以检查它们,然后才能将最终用户转发到该URL。

除此以外,您知道这是IIS无法按您希望的方式处理它的唯一情况。因此,通过消除的过程,如果您有未处理的请求,则知道是什么原因造成的。

也许在自定义400页中检查引荐来源网址将有助于缩小流量来源?


2

IIS论坛上的此帖子表明HTTP 400(错误请求)已被http.sys阻止,并且未访问与IIS匹配的IIS,该链接与@Scott Forsyth-MVP包含在其原始答案中的链接相匹配。

您可以在c:\ Windows \ System32 \ LogFiles \ HTTPERR \下看到这些请求的日志

我不知道您是否可以针对此类错误配置发送给用户的响应页面,但是由于即使Bing也遭受此问题的困扰,我怀疑这是不可能的,或者可能需要一些可怕的系统黑客。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.