我正在寻找任何types的解决scheme,以正确获得IIS请求,如https://stackoverflow.com/%和http://bing.com/%不显示400错误的请求页面,但显示自定义错误页面类似于http://google.com/%和http://facebook.com/% (显然这些例子不在IIS上)。
我相信我已经尝试设置每个http://support.microsoft.com/kb/820129所有适用的http.sysregistry设置(AllowRestrictedChars,PercentUAllowed),但没有帮助。 设置AllowRestrictedChars和一个自定义的400页面有固定的URL,如https://stackoverflow.com/%12,但不是/%。
这在IIS内核级别被阻止。 作为一个testing,我拿出了在IIS中的每一个模块,使它甚至没有一个静态页面处理程序,它仍然显示400错误消息。
我不相信用IIS来解决这个问题是可能的。 您提到的registry设置适用于其他types的限制字符。 我还没有看到改变这个function的杠杆。
你的目标是什么避免? 它打开你的攻击面更广泛,我不能想象一个合法的访问者由于阻止不完整的URL转义序列而丢失。
Update2:这里有三个很好的链接。 来自IIS团队的Nazim Lala和Wade Hilmo已经就此进行了博客讨论,因为围绕你的问题进行了讨论。 另外Scott Hanselman在.NET中的querystring部分有一个很棒的post:
更新:我检查了一个IIS小组的成员来获得一个权威的答案。 他提到根据RFC 1738( http://www.ietf.org/rfc/rfc1738.txt ),%被认为是不安全的字符。
这是相关的文字:
不安全:
字符可能由于多种原因而不安全。 空格字符是不安全的,因为重要空格可能会消失,当URL被转录或排版或受到文字处理程序的处理时,可能会引入不重要的空格。 字符“<”和“>”是不安全的,因为它们被用作自由文本中的URL周围的分隔符; 在某些系统中,引号(“”)用于分隔URL,字符“#”是不安全的,应该总是被编码,因为它在万维网和其他系统中被用来从片段/锚标识符可能跟着它,字符“%”是不安全的,因为它用于其他字符的编码,其他字符是不安全的,因为网关和其他传输代理有时会修改这些字符,这些字符是“{”,“} “,”|“,”\“,”^“,”〜“,”[“,”]“和”`“。
所有不安全的字符必须始终在URL中进行编码。 例如,即使在通常不处理片段或锚点标识符的系统中,字符“#”也必须在URL中进行编码,因此,如果将URL复制到使用它们的另一个系统中,则不需要更改url编码。
所以IIS在核心层面积极地阻止了这种攻击,这是一种主动的安全措施,可以最大限度地减less攻击面。
我可以想到3种可能的方法
将IIS更改为指向400个错误的自定义页面比正常情况
如果这对于IIS中的特定网站是唯一的,则可以在web.config中执行如下操作:
<customErrors defaultRedirect =“ErrorPage.aspx”mode =“On”>
<error statusCode =“400”redirect =“myCustom400Error.aspx”/>
</的customErrors>
编写一个httpModule来检查传入的URL并处理它们
唯一的解决办法就是在IIS内核之前检查URL。
您需要通过脚本发送您的dynamic生成的链接检查它们,然后将您的最终用户转到该URL。
除此之外,你知道这是唯一的情况下,IIS不会按照你想要的方式处理它。 所以,通过淘汰的过程,如果你有一个未处理的请求,你知道是什么造成的。
也许在一个自定义的400页面检查引用者将有助于缩小stream量的来源?
这个post在IIS论坛上表明,HTTP 400(Bad Request)被http.sys阻止,并且不会将其设置为匹配@ Scott Forsyth – MVP包含在其原始答案中的链接。
您可以在c:\ Windows \ System32 \ LogFiles \ HTTPERR \下查看这些请求的日志。
我不知道是否可以configuration响应页面,这是发送给用户的这种types的错误,但即使Bing受到这个问题,我怀疑这是不可能的,或将需要一些可怕的系统黑客。