簡介html
那些經過請求(如查詢字符串和表單數據)指定重定向URL的Web程序可能會被篡改,而把用戶重定向到外部的惡意URL。這種篡改就被稱爲開發重定向攻擊。git
場景分析github
假設有一個正規網站http://nerddinner.com/,還有一個惡意網站或釣魚網站http://nerddiner.com/(注意:這裏少了個n)。網站
一天,小白收到了別人發的連接:http://nerddinner.com/Account/LogOn?returnUrl=http://nerddiner.com。this
1. 打開連接後進入了登陸界面,小白輸入了本身的賬號名密碼進行登陸。url
2. 登陸成功後重定向到了惡意網站。spa
3. 惡意網站是一個仿造正規網站的登陸頁面,並在上面提示用戶名或密碼錯誤。3d
4. 小白按照提示從新輸入了賬號密碼信息。code
5. 惡意網站保存了客戶的用戶名密碼,而後重定向會正規網站。orm
6. 小白繼續平時正常的操做。
防止開放重定向
防止開發重定向只須要判斷重定向的連接是本地的連接或者是合法的連接便可。
1. 若是登陸連接和站點其餘頁面都在同一個域名,在ASP.MVC中能夠用Url.IsLocalUrl(string url)來判斷。
2. 若是登陸連接和站點其餘頁面不在同一個域名,如單點登陸,則須要本身去實現判斷的邏輯。
核心代碼
1 [HttpPost] 2 public ActionResult LogOn(LogOnModel model, string returnUrl) 3 { 4 //Your logon logic here. 5 FormsAuthentication.SetAuthCookie(model.UserName, false); 6 //Comment out this code will cause open redirection 7 if (!string.IsNullOrEmpty(returnUrl)&& Url.IsLocalUrl(returnUrl)) 8 { 9 return Redirect(returnUrl); 10 } 11 return RedirectToAction("Index", "Home"); 12 }
聯想到XSS
1. 惡意用戶在正規網站下掛了跳轉到惡意網站的腳本。
2. 普通用戶訪問到含惡意腳本的頁面會跳轉到惡意網站。
3. 惡意網站是一個仿造正規網站的登陸頁面,並在上面提示須要從新登陸。
4. 小白按照提示從新輸入了賬號密碼信息。
5. 惡意網站保存了客戶的用戶名密碼,而後重定向會正規網站。
注:這種方式每次訪問含惡意腳本的頁面都會跳轉到惡意網站(提示從新登陸),而開放重定向只會提示用戶名密碼錯誤一次,相對而言,開放重定向的無感知效果要好一點。
若是你們想嘗試開放重定向的效果,能夠去下載代碼,把判斷本連接的語句Url.IsLocalUrl(returnUrl)註釋掉,而後在登陸頁面加上想要跳轉到的頁面,如http://xxx.com/Account/LogOn?ReturnUrl=http://www.baidu.com。