2009-09-24 51 views
3

在我目前正在建设的网站中,我们需要大量的动态重定向,以保持网站各部分的流量。Response.Redirect偶尔会忽略URL编码

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

在95%的情况下,这很好,但是我注意到有时URL被破坏得很厉害。

在一种情况下,url是URLEncoded,因为其中一个参数有时包含&符号,但是重定向忽略了这一点并重定向到非编码版本。

即 “page.aspx?适量=第一%26秒&适量= 2个& QS = 3” 正被重定向至 “page.aspx?适量=第一&第二& QS = 2个& QS = 3”

发生的另一种情况是响应完全被剥离了&符号,导致频繁崩溃。

即 “page.aspx?QS = 1个& QS = 2个& QS = 3” 被重定向到 “page.aspx?QS = 1QS = 2QS = 3”

没有人有任何想法,为什么无论是这些情景可能会发生?

议决

对不起,这是由于我自己的白痴,从管理重定向到非管理员(不要问),而不是把&再次或URL编码的背部上几页。

(捂脸)

回答

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方法执行自己的编码时可能出现的任何编码问题的最好方法是在将它传递给Redirect方法之前,自己显式编码字符串URL参数。

Response.Redirect MSDN文章:

始终验证和编码传递给Response.Redirect的到 防止跨站点脚本攻击 的URL 。有关如何从 字符串中删除有害字符的信息,请参阅Removing Harmful Characters from User Input

请注意,在不使用完全限定的URL时,Response.Redirect方法中也有previously been bugs。是否有可能使用易受此问题影响的.NET框架版本?

+0

我使用的是.NET 3.5,并且在将URL传递给response.redirect方法之前,我手动对URL进行了任何用户输入编码。我知道它是自己的内部编码和解析,如果是这种情况,那么这个问题将包含在网站中的所有重定向链接中,而不仅仅是4或5的错误操作! – 2009-09-24 15:58:29