csrf介绍

跨站点请求伪造 (CSRF) 是一种攻击类型,当恶意网站、电子邮件、博客、即时消息或程序导致用户的 Web 浏览器在用户通过身份验证时在受信任站点上执行不需要的操作时,就会发生这种攻击。CSRF 攻击有效,因为浏览器请求会自动包含所有 cookie,包括会话 cookie。因此,如果用户通过了站点的身份验证,站点就无法区分合法的授权请求和伪造的身份验证请求。当使用适当的授权时,这种攻击会被阻止,这意味着需要一种质询-响应机制来验证请求者的身份和权限。

成功的 CSRF 攻击的影响仅限于易受攻击的应用程序暴露的能力和用户的权限。例如,这种攻击可能会导致资金转移、更改密码或使用用户凭据进行购买。实际上,攻击者使用 CSRF 攻击使目标系统通过受害者的浏览器执行功能,而受害者不知道,至少在未经授权的交易被提交之前。

csrf攻击类型

GET类型的CSRF

<img src="http://bank.example/withdraw?account&=xx&amount=100&to=hacker" >

受害者访问了html标签里有img属性的页面以后,就会向该网站发送一个http请求,该网站也会收到包含受害者登录信息的一次跨域请求。

Post类型的CSRF

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

访问带有该表单的页面以后会向bank网站发送一次post请求。

链接类型的CSRF

这种类型的csrf需要用户点击链接才能触发,通常会诱骗用户点击。各位lsp请注意一下

csrf的防御

同源检测

在HTTP协议中,每一个异步请求都会携带两个Header,用于标记来源域名:

  Origin Header

  Referer Header

这两个Header不能由前端自定义内容。 服务器通过解析这两个Header中的域名,确定请求的来源域。

同步器令牌模式

CSRF 令牌在服务器端生成,它们可以为每个用户会话或每个请求生成一次。每个请求令牌比每个会话令牌更安全。在初始生成令牌后的每个会话令牌实现中,该值存储在会话中并用于每个后续请求,直到会话过期。

不应使用 cookie 传输 CSRF 令牌

CSRF 令牌可以通过隐藏字段、标题添加,并且可以与表单和 AJAX 调用一起使用。GET 请求中的 CSRF 令牌可能会在多个位置泄露。

双重提交 Cookie

双重Cookie采用以下流程:

  双重Cookie采用以下流程:

  在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串(例如csrfcookie=v8g9e4ksfhw)。

  在前端向后端发起请求时,取出Cookie,并添加到URL的参数中(接上例POST https://www.a.com/comment? csrfcookie=v8g9e4ksfhw)。 

  后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。

  • 用双重Cookie防御CSRF的优点:
    无需使用Session,适用面更广,易于实施。
    Token储存于客户端中,不会给服务器带来压力。
    相对于Token,实施成本更低,可以在前后端统一拦截校验,而不需要一个个接口和页面添加。
    缺点:
    Cookie中增加了额外的字段。
    如果有其他漏洞(例如XSS),攻击者可以注入Cookie,那么该防御方式失效。
    难以做到子域名的隔离。
    为了确保Cookie传输安全,采用这种防御方式的最好用整站HTTPS的方式,如果还没切HTTPS的使用这种方式也会有风险。

Samesite Cookie属性

Samesite 有两个属性值,分别是 Strict 和 Lax。Strict表示严格模式,即不接受第三方cookie,意思很明了,就是通过百度跳转到淘宝京东的页面时,并不会是登录状态。Lax表示宽松模式,假如是跳转页面且是get请求时,可以作为第三方cookie