2009-09-24 72 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