3

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

我目前正在使用 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 编码。

(捂脸)

4

1 回答 1

6

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

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

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

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

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

于 2009-09-24T15:25:31.817 回答