Ed *_*mes 3 c# redirect url-encoding
在我正在构建的网站中,我们需要大量的动态重定向,以保持网站各部分的流量.
我目前正在使用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参数执行一些编码.
这可以通过查看Response.RedirectReflector中方法的反汇编来证明.除此之外,该Redirect方法还执行:
url = this.ApplyRedirectQueryStringIfRequired(url);
url = this.ApplyAppPathModifier(url);
url = this.ConvertToFullyQualifiedRedirectUrlIfRequired(url);
url = this.UrlEncodeRedirect(url);
Run Code Online (Sandbox Code Playgroud)
查看这些函数中的每一个,都会调用其他函数,例如:
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)
Run Code Online (Sandbox Code Playgroud)
这些函数中的每一个都试图以某种方式对提供的字符串URL参数进行编码(或转换).
根据此页面:Response.Redirect和编码的URI(以及从此处链接的其他URI),执行此编码可能存在一些问题,具体取决于输入字符串.
似乎避免在允许Redirect方法执行自己的编码时可能出现的任何编码问题的最佳方法是在将字符串URL参数传递给Redirect方法之前自己显式编码.
来自Response.RedirectMSDN文章:
始终验证并编码传递给Response.Redirect的URL,以防止跨站点脚本攻击.有关如何从字符串中删除有害字符的信息,请参阅从用户输入中删除有害字符.
请注意,在不使用完全限定的URL时,Response.Redirect方法编码中也存在先前的错误.您是否有可能使用易受此问题影响的.NET框架版本?
| 归档时间: |
|
| 查看次数: |
4882 次 |
| 最近记录: |