这在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在核心级别上主动阻止了此行为,这是一种主动安全措施,可最大程度地减少攻击面。