Web开发安全之CSRF | 青训营笔记

98 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第13天

CSRF

一. 简介

  1. CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

  2. XSS主要是利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求,来利用受信任的网站。与XSS攻击相比,CSRF更具危险性。

  3. http 是无状态的,服务端通过客户端 cookie 对当前请求鉴权。CSRF 就是利用的是网站对用户客户端的信任进行攻击。 对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以受害者身份发邮件、发消息,甚至于购买商品、虚拟货币转账等。

二. 常见CSRF

GET 类型 CSRF

如果有接口可以直接通过 GET 请可以进行敏感操作,攻击者可以直接通过页面加载图片的方式进行攻击,浏览器会自动发送 https://bank.com/withdraw?amount=1000&for=hacker,从达到攻击效果。

POST 类型 CSRF

这种类型攻击通常是使用表单的方式进行的:

<form action="http://bank.example/withdraw" method=POST>
    <input type="hidden" name="account" value="xiaoming" />
    <input type="hidden" name="amount" value="1000" />
    <input type="hidden" name="for" value="hacker" />
</form>
<script> document.forms[0].submit(); </script>

三. CSRF 防范

referer

通过服务端校验请求 referer,阻止非信任域访问。referer属性是可以修改的,所以在服务器端校验 referer 属性并不可靠。

CSRF Token

  1. 生成 CSRF token - 用户访问页面,服务端生成一个 CSRF Token 发送给浏览器
  • Synchronizer Tokens:通过响应页面时将 token 渲染到页面上,在 form 表单提交的时候通过隐藏域提交上来。
  • Double Cookie Defense:将 token 设置在 Cookie 中,在提交(POST、PUT、PATCH、DELETE 等)请求时提交 Cookie,并通过 header 或者 body 带上 Cookie 中的 token,服务端进行对比校验。
  1. 浏览器请求时携带 CSRF Token
  2. 服务器收到请求后,验证 CSRF token 是否合法,如果不合法拒绝请求