ASP.NET请求验证忽略URL编码

时间:2012-07-09 05:32:35

标签: asp.net .net-4.0 asp.net-4.0

我在Azure上运行ASP.NET 4。我偶然发现了微软的这个很棒的新功能,其中服务器完全忽略了URL编码。

起初我遇到了%26的问题,并且收到了&标志是不允许的。 这显然是一个错误,因为%26不在&并且%26的全部意义是能够安全地将其传递给网址。

www.example.com/this-is-me-%26-microsoft /

我可以通过将此添加到web配置来解决此问题:

   <httpRuntime requestValidationMode="2.0" executionTimeout="20" requestPathInvalidCharacters="" />
    <pages validateRequest="false"/>

这解决了%26问题,但现在我发现问题远未结束,因为编码#的%23表现得好像是#而不是%23

www.example.com/%23this-should-work /

我需要永久解决这个问题。我不需要这个完全错误的请求验证。 我发现这个link谈论了这种疯狂,但我无法理解如何在网络应用中使用此URL_ESCAPE_SEGMENT_ONLY。

修改

从2009年发现这个link:看起来这个问题已经持续了一段时间,但是注意到了,因为微软并不关心......

EDIT2 !!!:

经过一整天的工作并尝试在互联网上找到的每一个可能的解决方案/解决方法(足以写完整本书),我已经将此视为一个非常具体的错误。 我的幸运是,通过纯粹的机会,测试用例url在这个段的开头有%23。

http://www.example.com/%23eleven/

事实证明,如果%23位于片段的开头,它会自动转义为#并以#处理,世界上没有办法改变它。

为了说明这一点,请运行:

Response.Write(Request.Url.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped));

在包含流动网址的页面中

http://www.example.com/%23elevenand%23noteleven/

响应写入将输出:

http://www.example.com/#elevenand%23noteleven/

如果你这样做:

Response.Write(Request.Url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped));

结果将是:

elevenand#noteleven/

P.S。除了我在整个调试过程中学到的这个特殊错误之外,.NET中的整个URL编码和解码在所有遗留(.NET 4之前版本)中都是完全的灾难,但也是所有新的。 NET 4的修改甚至更大的灾难就像在火中加入气体一样。没有一个能够正常工作,用户报告这一点会在董事会上发布大量帖子,但微软会忽略所有内容并将报告的错误关闭并解决并重复。

0 个答案:

没有答案