【问题标题】:How may i escape / and other characters in asp.net?我如何在 asp.net 中转义 / 和其他字符?
【发布时间】:2011-01-12 21:52:59
【问题描述】:

当我访问 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 吗?我认为转义 url 的重点是?、&、/ 和其他特殊符号不要与它们在 url 中的特殊含义混淆。也许我需要调整配置?


我创建了 4 个用户名,有

a?@!&ee
a?@!/&ee
as d
クイン

链接为

<a href="/u/a%3f%40%21%26ee">a?@!&amp;ee</a><br>
<a href="/u/a%3f%40%21%2f%26ee">a?@!/&amp;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。我怎样才能允许这些用户名工作。如果不可能,我该如何编写解决方法?

【问题讨论】:

    标签: asp.net url escaping


    【解决方案1】:

    我编写了自己的解决方案。很高兴有一个带有 / 的用户名,但在收到 GET 请求时不考虑为 /。

    【讨论】:

      【解决方案2】:

      你需要再次逃脱它。使用%252f 而不是%2f。澄清一下,当服务器接收到 URL 时,它是未编码的。 URL 编码允许您传入/,服务器将其作为字符处理,而不是保留字符通常会触发的特殊功能。有关详细信息,请参阅 Wikipedia 页面。

      关于a?@!&amp;ee 用户名的错误,似乎几乎可以肯定,您遇到了一个问题,即 ASP.NET 遇到了不在查询字符串中的特殊字符(甚至正确编码)(即URL 的? 部分)。 Joshua Flanagan 谈到它 in a blog post,并将 %&amp;*: 识别为有问题的字符。

      他指向一个Dirk.Net blog post,它提供了一些修复。首先,您可以edit the registry 允许限制字符(将 DWORD 键 AllowRestrictedChars 添加到 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)预期的那样。

      【讨论】:

      • 好答案。你知道我需要转义两次的其他字符吗?
      • 百分比编码百分比(即使用%25而不是%)应该涵盖所有情况。如果 URL 将被多次传递,您可以将其链接多次,例如 %252525252f 被转义 5 次(4 25s 和原始转义 %2f
      • %252f 给我一个错误的请求。
      • 我刚刚做了一个测试,我可以用href="/sdlk%252fsd/test.txt"超链接到一个名为sdlk%252fsd的文件夹中的文件,所以我认为如果@@ 987654348@ 正在中断请求。
      • 我使用的是 3.5。我将两者都添加到了注册表中(dword,我现在再次检查了两者)并且validateRequest(较低的 v)已经设置为允许unsafe POST 数据。仍然没有运气:(
      猜你喜欢
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多