当我访问http://localhost:17357/u/a%2fa/m/ssd-10
并查看Application_BeginRequest中的HttpContext.Current.Request.Url
时,我会看到http://localhost:17357/u/a/a/m/ssd-10
嗯?我不应该http://localhost:17357/u/a%2fa/m/ssd-10
吗?我认为逃避网址的重点是什么?,&,和其他特殊符号不要与网址中的特殊含义相混淆。也许我需要调整配置?
我创建了4个用户名,有
a?@!&ee
a?@!/&ee
as d
クイン
链接为
<a href="/u/a%3f%40%21%26ee">a?@!&ee</a><br>
<a href="/u/a%3f%40%21%2f%26ee">a?@!/&ee</a><br>
<a href="/u/as%20d">as d</a><br>
<a href="/u/%ef%bd%b8%ef%bd%b2%ef%be%9d">クイン</a>
最后两个工作,但前两个我得到了例外
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
Additional information: Illegal characters in path.
然后
A first chance exception of type 'System.Web.HttpException' occurred in System.Web.dll
Additional information: '/u/a?@!&ee' is not a valid virtual path.
我的页面显示Bad Request
。我如何允许这些用户名工作。如果不可能我怎么写一个解决方法?
答案 0 :(得分:5)
你需要再次逃脱它。使用%252f
代替%2f
。为了澄清,当服务器收到URL时,URL是未编码的。 URL编码允许您传入服务器作为字符处理的/
而不是保留字符通常会触发的特殊功能。有关详细信息,请参阅Wikipedia页面。
关于使用a?@!&ee
用户名的错误,几乎可以肯定您遇到的问题是ASP.NET具有不在查询字符串中的特殊字符(即使是urlencoded正确)(即,在URL的?
部分之后)。 Joshua Flanagan谈到它in a blog post,并将%
,&
,*
和:
标识为有问题的角色。
他指向Dirk.Net blog post提供了一些修复。首先,您可以edit the registry允许受限字符(向AllowRestrictedChars
添加DWORD键HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters
并将其布尔值设置为true)。或者,您可以确保拥有.NET framework 1.1 SP1 and edit the registry to set ASP.NET VErification Compatibility to true(DWORD HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET VerificationCompatibility = 1
)。第三,您可以尝试在ASPX页面上将ValidateRequest
设置为false。最后,正如Joshua决定做的那样,您可以使用查询字符串传递信息,即在?
之后作为ASP.Net最初(预先MVC)预期。
答案 1 :(得分:0)
我写了自己的解决方案。很高兴有一个用户名/但不考虑/在获得GET请求时。