前一陣子維護的 web 進行安全性掃描,
被列了一個 issue ,就是 open redirection attack,
至於什麼是 open redirection attack ,又該如何解決呢?
有興趣就接著往下看吧!
What's Open Redirection Attacks ?
Any web application that redirects to a URL that is specified via the request such as the querystring or form data can potentially be tampered with to redirect users to an external, malicious URL. This tampering is called an open redirection attack.
舉例來說,當某頁面需要登入權限,但還未登入時,當輸入網址後,會被導至登入頁,
在登入成功後,透過 returnUrl 會再導回原頁面,
如:
當我想進入 http://somewebhost/xxx/list
因為還未登入,所以被導至 http://somewebhost/Account/LogOn?returnUrl=/xxx/list
但成功登入後,則透過 returnUrl 導至 http://somewebhost/xxx/list
這一切都很完美,但對有心人士來說,也很完美,
怎麼說呢? 就是透過 returnUrl 這個特性,可以把使用者導引至惡意網站,
可以這麼做,組成以下連結,讓使用者誤以為進入正確的網站(也許是某金融網站 )
http://somewebhost/Account/LogOn?returnUrl=http://someBadWeb/doSomething
但成功登入後,卻會將使用者導至另一個惡意網站,而使用者會以為是正常的登入成功,
可能因此填入重要個資,如信用卡號碼等等,
形成一種釣魚網站的手法,十分可怕
該如何預防?
就是檢查 returnUrl 是否是合法的,也就是說只能導至目前 host 下的網址,
在 asp.net MVC3 以上的寫法,
使用 System.Web.Mvc.Url helper 類別方法 IsLocalUrl() ,
來判斷 returnUrl 是否是合法的,如下:
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
若不是 MVC 專案,
則可利用以下方法進行驗證:
public static bool IsUrlLocalToHost(this HttpRequestBase request, string url)
{
return !url.IsEmpty() &&
((url[0] == '/' && (url.Length == 1 ||
(url[1] != '/' && url[1] != '\\'))) ||
(url.Length > 1 &&
url[0] == '~' && url[1] == '/'));
}
以上就可以解決此 issue 囉!
參考:
http://www.asp.net/mvc/overview/security/preventing-open-redirection-attacks