Response.Redirect偶尔会忽略URL编码

在我正在构建的网站中,我们需要大量的动态重定向,以保持网站各部分的流量。

我目前正在使用response.redirect来实现这一点,重定向URL是在各种按钮的回发方法后面的代码中动态生成的。

这种情况在95%的案例中都很好,但是我注意到有时URL会被严重破坏。

在一种情况下,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重新输入或url编码。

(捂脸)

我会说,发生这种情况的原因是由于Response.Redirect方法在内部如何工作。

在内部,Redirect方法将检查字符串URL参数,如果认为有必要,在实际执行重定向之前对字符串URL参数执行一些编码。

这可以通过查看Reflector中的Response.Redirect方法的反汇编来certificate。 除其他外, 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文章:

始终validation并编码传递给Response.Redirect的URL,以防止跨站点脚本攻击。 有关如何从字符串中删除有害字符的信息,请参阅从用户输入中删除有害字符 。

请注意,在不使用完全限定的URL时,Response.Redirect方法编码中也存在先前的错误 。 您是否有可能使用易受此问题影响的.NET框架版本?