Skip to content

CSRF(跨站请求伪造)攻击原理与防御方案

CSRF: 跨站请求伪造

攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求

攻击流程

用户登录A.com ---> 访问B.com ---> B.com发起请求A.com(携带cookie) ---> 因为cookie作身份认证,A服务器以为是A自己发送的请求,故接受该请求

CSRF防范手段

    1. 同源检测:请求头referer(当前完整url)、origin字段
    1. 设置cookie的SameSite为strict或者lax,该属性可以让 Cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)【不支持IE

详见cookie字段详解) (sameSite属性lax说明表

    1. csrf-token验证

用户登录输入账号密码,请求登录接口,后端在用户登录信息正确的情况下将token放到后端session中,并返回token给前端,前端把token 存放在localStorage/sessionStorage中,之后再发送请求将token放到header中

  • 由于同源策略,第三方网站是拿不到localStorage/sessionStorage的

两种常见的csrf攻击类型

1. 跨域get请求:利用a/img/script等DOM标签请求(仅IE会跨域携带cookie)

html
 <img src="http://A.com/api" >
 <a src="http://A.com/api" > test </a>
 <script src="http://A.com/api"></script>
<!-- 在非同源下,不受同源策略影响可以正常请求 -->

经测试:

结论:

都是get请求,现代开发模式get用于请求资源,一般造不成实际伤害

2. 跨域post请求:表单提交【不存在跨域问题】

  • form 提交(submit)之后,是不会有任何数据返回的,没机会读任何东西,所以可以认为是无害的,不在同源策略之内。 而 AJAX 是可以读取响应内容的,因此浏览器的同源策略不允许这样的行为。
html
<!-- 例如在A.com下请求 -->
<form action="http://B.com/api" method=POST>
  <input type="hidden" name="account" value="xiaoming" />
  <input type="hidden" name="amount" value="10000" />
  <input type="hidden" name="for" value="hacker" />
</form>
<script> document.forms[0].submit(); </script>
  • 经测试,可以正常请求跨域地址B.com,但是不会携带发起请求站点A.com的cookie。

  • chrome中cookie的sameSite为none时会携带B.com的cookie。由于IE不支持SameSite属性,所以会发送cookie