前言
簡單介紹一下重定向攻擊。
正文
攻擊思路:

看着上面挺復雜的,其實是一些很簡單的步驟。
- 攻擊者通過某些手段,讓用戶打開了一個好站點,打開的這個地址里面帶有重定向信息,重定向信息就是自己偽造的站點。
這是因為我們一般不知道網站從哪個頁面而來,登錄后會返回偽造的站點,也就是我們的后台會利用重定向信息。
-
然后用戶就輸入了正確的賬戶密碼,然后重定向到偽造的站點,這個偽造的站點也是一個登錄頁面,和真實站點一模一樣。
-
這個時候用戶以為自己賬戶密碼輸入錯誤,然后再輸入一遍,這個時候攻擊者就拿到了用戶的賬戶密碼,然后再跳轉到官方站點。
-
因為跳轉到官方站點了,然后用戶是可以正常操作的,用戶就以為一切操作正常,然后就很開心的買買買了。
上述攻擊步驟大體是這樣。
攻擊的必要條件:
-
我們的站點沒有驗證重定向的地址
-
用戶訪問了偽造站點
第二點基本上沒有解決方案,因為我們不知道會遇上什么樣的用戶。
重定向方案:
-
使用localRedirest 來處理重定向
-
驗證重定向的目標域名是否合法
那么下面就看下這兩種防范方式。
[HttpGet]
public async Task<IActionResult> CookieLogin(string userName,string returnUrl)
{
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim("Name", userName));
await this.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,new ClaimsPrincipal(identity));
return Redirect(returnUrl);
}
看到了吧,上面就直接通過Redirect(returnUrl);來跳轉。
那么可以通過這樣:return LocalRedirect(returnUrl);
這樣就是只能跳轉到同域名的網址下面。
LocalRedirect 會有驗證,然后拋出異常,然后就被我們的未處理異常處理了,然后就進入404這樣子。
那么這里希望處理一下。
public async Task<IActionResult> CookieLogin(string userName,string returnUrl)
{
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim("Name", userName));
await this.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,new ClaimsPrincipal(identity));
// return Redirect(returnUrl);
try
{
return LocalRedirect(returnUrl);
}
catch
{
return Redirect(returnUrl);
}
}
如果發現異常,跳轉到首頁,避免用戶認為我們的網站崩潰現象。
那么如果我們有子站點就是和當前登錄頁面不是同一域名的情況呢?那么這個時候就需要我們自己驗證,尤其是現在的授權認證獨立出來服務后。
Uri uri = new Uri(returnUrl);
// 驗證一下
// 自我驗證,根據數據庫列表驗證,根據配置驗證等
return Redirect(returnUrl);
結
下一節防跨站腳本攻擊。
