我想说,发生这种情况的原因是由于Response.Redirect
方法在内部起作用。
在内部,Redirect 方法将检查字符串 URL 参数,如果认为有必要,则在实际执行重定向之前对字符串 URL 参数执行一些编码。
这可以通过查看拆解来证明Response.Redirect
Reflector 中的方法。除其他事项外,Redirect
方法执行:
url = this.ApplyRedirectQueryStringIfRequired(url);
url = this.ApplyAppPathModifier(url);
url = this.ConvertToFullyQualifiedRedirectUrlIfRequired(url);
url = this.UrlEncodeRedirect(url);
查看每个函数,都会调用其他函数,例如:
internal static string UrlEncodeNonAscii(string str, Encoding e)
internal static string UrlEncodeSpaces(string str)
private static byte[] UrlEncodeBytesToBytesInternalNonAscii(byte[] bytes, int offset, int count, bool alwaysCreateReturnValue)
这些函数中的每一个都尝试以某种方式对提供的字符串 URL 参数进行编码(或转换)。
根据这个页面:Response.Redirect 和编码的 URI(以及从此处链接的其他内容),执行的编码可能会出现一些问题,具体取决于输入字符串。
看来,避免允许时可能出现的任何编码问题的最佳方法是Redirect
进行自己的编码的方法是在将字符串 URL 参数传递给Redirect
method.
来自Response.Redirect
MSDN 文章:
始终验证 URL 并对其进行编码
传递给 Response.Redirect 到
防止跨站点脚本编写
攻击。有关如何进行的信息
从中删除有害字符
字符串,参见从用户输入中删除有害字符.
请注意,还有以前是错误当不使用完全限定的 URL 时,在 Response.Redirect 方法中进行编码。您使用的 .NET 框架版本是否可能容易受到此问题的影响?