前言

简单介绍一下重定向攻击。

正文

攻击思路:

看着上面挺复杂的,其实是一些很简单的步骤。

  1. 攻击者通过某些手段,让用户打开了一个好站点,打开的这个地址里面带有重定向信息,重定向信息就是自己伪造的站点。

这是因为我们一般不知道网站从哪个页面而来,登录后会返回伪造的站点,也就是我们的后台会利用重定向信息。

  1. 然后用户就输入了正确的账户密码,然后重定向到伪造的站点,这个伪造的站点也是一个登录页面,和真实站点一模一样。

  2. 这个时候用户以为自己账户密码输入错误,然后再输入一遍,这个时候攻击者就拿到了用户的账户密码,然后再跳转到官方站点。

  3. 因为跳转到官方站点了,然后用户是可以正常操作的,用户就以为一切操作正常,然后就很开心的买买买了。

上述攻击步骤大体是这样。

攻击的必要条件:

  1. 我们的站点没有验证重定向的地址

  2. 用户访问了伪造站点

第二点基本上没有解决方案,因为我们不知道会遇上什么样的用户。

重定向方案:

  1. 使用localRedirest 来处理重定向

  2. 验证重定向的目标域名是否合法

那么下面就看下这两种防范方式。

[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);

下一节防跨站脚本攻击。

最新文章

  1. 学习ES6--data1
  2. PHP跳转页面的几种实现方法详解
  3. matlab之waitbar() delete() close()
  4. Linux内核中的常用宏container_of
  5. [html][转]常用返回顶部代码
  6. stdarg.h详解
  7. 新西兰gap year_百度百科
  8. Saltstack 操作目标,正则匹配,及组管理
  9. Entity Framework Core 执行SQL语句和存储过程
  10. SpringMVC简单配置
  11. 2017ecjtu-summer training #4 UESTC 30
  12. 在ASP.Net Core下,Autofac实现自动注入
  13. [PHP] sys_get_temp_dir()和tempnam()函数报错与环境变量的配置问题
  14. vue-cli跳转到新页面的顶部
  15. java应用程序的运行机制
  16. 基于服务器AAA的实验
  17. golang context
  18. C++ MFC棋牌类小游戏day2
  19. SQLserver 使用网络驱动器恢复数据库
  20. SPARK快学大数据分析概要

热门文章

  1. VBA绘制Excel图表
  2. 云计算OpenStack环境搭建(4)
  3. 11.3 free:查看系统内存信息
  4. sprintf和snprintf函数
  5. Linux 使用命令发送邮件
  6. 大作!webpack详细配置
  7. Mysql索引数据结构为什么是B+树?
  8. 【Dubbo】SPI
  9. Go语言协程并发---select多路复用应用
  10. GO语言常用标准库04---flag读取命令行参数