在我目前正在建设的网站中,我们需要大量的动态重定向,以保持网站各部分的流量。
我目前正在使用response.redirect来实现这一点,重定向URL是在各种按钮的回发方法后面的代码中动态生成的。
95%的情况都没问题,但我注意到网址有时会被严重损坏。
在一种情况下,url是URLEncoded,因为其中一个参数有时包含&符号,但重定向忽略了这一点并重定向到非编码版本。
即。 “page.aspx?qs = first%26second& qs = 2& qs = 3”被重定向到“page.aspx?qs = first& second& qs = 2& qs = 3”
另一种情况是,响应完全被剥去了&符号,导致频繁崩溃。
即。 “page.aspx?qs = 1& qs = 2& qs = 3”被重定向到“page.aspx?qs = 1qs = 2qs = 3”
有没有人知道为什么会出现这些情况?
分辨
很抱歉,这是由于我自己的愚蠢行为,从管理员重定向到非管理员(不要问),而不是在几页上再次将& s重新输入或网址编码。
(捂脸)
答案 0 :(得分:6)
我想说这种情况发生的原因是Response.Redirect
方法在内部的运作方式。
在内部,Redirect方法将检查字符串URL参数,如果认为有必要,在实际执行重定向之前对字符串URL参数执行一些编码。
这可以通过查看Reflector中Response.Redirect
方法的反汇编来证明。除此之外,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 and encoded URIs(以及此处链接的其他内容),执行此编码可能会出现一些问题,具体取决于输入字符串。
在允许Redirect
方法执行自己的编码时,避免出现任何编码问题的最佳方法似乎是在将字符串URL参数传递给{{1方法。
来自Redirect
MSDN文章:
始终对URL进行验证和编码 传递给Response.Redirect的 防止跨站点脚本 攻击。有关如何使用的信息 删除有害字符 字符串,请参阅Removing Harmful Characters from User Input。
请注意,当不使用完全限定的URL时,Response.Redirect方法编码中还有previously been bugs。您是否有可能使用易受此问题影响的.NET框架版本?