简介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。