当查询字符串是UrlEncoded或在ASP.NET中具有百分比字符时,如何从Request对象获取实际的查询字符串?

基本上,如果我有这样的网址: Default.aspx?p =%b4 ,如何获取填充了“%b4”的字符串?

Request.QueryString [" p"] 返回不可打印的字符。

Request.RawUrl 返回Default.aspx?p =%ufffd"

Request.Url.AbsoluteUri 返回Default.aspx?p =%EF%BF%BD

我怎样才能得到“%b4”回来?

有帮助吗?

解决方案

我进一步挖掘了这个,并且相信我知道是什么导致了这个问题:HTTP客户端正在向服务器提交一个URL,该URL没有经过正确的URL编码。具体来说,URL中存在无效字符。

要重新登录,请将网址末尾的以下内容粘贴到IE8中: default.aspx?p ='

如果你检查线路上的字节数(例如使用 Fiddler ),你会看到实际的十六进制B4字符正在URL中从客户端发送到服务器。这是URL中的非法字符,因为URL仅限于0x80下的字符代码(任何大于0x80的字符代码必须进行百分比转义)。

所以你的客户端传入一个无效字符,你的服务器正确地用%EF%BF%BD替换伪造的字符,这是 Unicode替换字符(U + 0FFD),当遇到没有等效字符的字符时会发生这种情况在本地编码中。

AFAIK,这是IE中的一个错误。如果您在Firefox中键入相同的URL,Firefox将正确编码URL(%b4而不是')。请注意,同样是AFAIK,问题只发生在手动将无效字符粘贴到IE的地址栏中时 - 如果链接中存在相同的字符,IE似乎正确编码URL(至少在我测试的情况下)。

因此,您应该弄清楚谁向您发送此虚假网址,并告诉他们开始正确编码其网址!

其他提示

当您执行Request.Querystring [" key"]时,Asp.net会自动对URL进行解码。你只需要再次编码。

HttpUtility.UrlEncode(Request.QueryString["p"])
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]

将返回RAW查询字符串

我遇到了同样的问题。我只是通过添加javascript“escape('text%text')”来解决它。同时构建查询串!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top