我会说发生这种情况的原因是由于该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(以及从此处链接的其他 URI),执行的此编码可能存在一些问题,具体取决于输入字符串。
Redirect
似乎避免在允许方法进行自己的编码时可能出现的任何编码问题的最佳方法是在将字符串 URL 参数传递给Redirect
方法之前自己对其进行显式编码。
来自Response.Redirect
MSDN 文章:
始终验证和编码传递给 Response.Redirect 的 URL,以防止跨站点脚本攻击。有关如何从字符串中删除有害字符的信息,请参阅从用户输入中删除有害字符。
请注意,以前在不使用完全限定 URL 时,Response.Redirect 方法编码中也存在错误。您是否可能正在使用易受此问题影响的 .NET 框架版本?