Response.Redirect偶尔会忽略URL编码

时间:2009-09-24 14:40:07

标签: c# redirect url-encoding

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

我目前正在使用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重新输入或网址编码。

(捂脸)

1 个答案:

答案 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框架版本?