手把手教你防御 CSRF 攻击

简介: 之前已经写了两篇关于 CSRF 的文章,其中昨天的一篇手把手教你实现一次 CSRF 攻击 留下了防御的悬念,而今天这篇就是教导如何防御 CSRF 攻击

之前已经写了两篇关于 CSRF 的文章,其中昨天的一篇手把手教你实现一次 CSRF 攻击 留下了防御的悬念,而今天这篇就是教导如何防御 CSRF 攻击

202212071826163.png

系列文章

  1. 手把手教你实现一次 CSRF 攻击
  2. [手把手教你防御 CSRF 攻击]()
  3. 面试题之 CSRF 攻击

CSRF 的触发方式

CSRF 本质上是 Cookie 的被利用(由于 sessionsessionid 通常也是使用 Cookie 传递,因此也可以被视为原因之一)

通常触发 CSRF 的攻击有如下

  1. 表单提交触发(POST
  2. Ajax 触发(POST
  3. GET 请求资源触发(比如图片或者 iframe

CSRF 的最终目的是保证复杂请求(有副作用)能够作用到服务器(并不强制要求有服务器的响应至客户端)

副作用:指对数据库做出修改:使用GET请求获取新闻列表,数据库中的记录不会做出改变,而使用PUT请求去修改一条记录,数据库中的记录就发生了改变。

复杂请求定义:

请求以 GET, HEAD 或者 POST 以外的方法发起请求。或者,使用 POST,但请求数据为 application/x-www-form-urlencoded, multipart/form-data 或者 text/plain 以外的数据类型。比如说,用 POST 发送数据类型为 application/xml 或者 text/xml 的 XML 数据的请求。 使用自定义请求头(比如添加诸如 X-PINGOTHER)

一旦归属于复杂请求,就会在发送复杂请求之前发送一次预检请求(option 请求)

简单请求定义:

只使用 GET, HEAD 或者 POST 请求方法。如果使用 POST 向服务器端传送数据,则数据类型(Content-Type)只能是 application/x-www-form-urlencoded, multipart/form-data 或 text/plain中的一种。 不能使用自定义请求头(类似于 X-Modified 这种)。

防御方式

此处就是八股文背诵阶段

规范

遵循良好的规范可以避免攻击,这也是一种“防御方式”

对于有副作用的接口,尽可能去使用 POST 请求而不是 GET 请求,并且避免使用简单请求而是使用复杂请求完成,使用预检请求来拦截可能的跨域请求

IMG

JWT/CSRF Token

如何在根本上终结 Cookie 利用?不用不就行了?而对应的鉴权就是使用 JWTJWT 是属于 CSRF Token 的两种实现的一种,是基于加密解密实现的有效性认证

注意,JWT 是基于的公钥私钥模块进行的加密解密而不是随机字符串,下面就是的作用原理(HTTPS 也是使用的公钥私钥原理)

  1. 登录时,后台拿到用户的鉴权信息,并结合三部分组成 token,分别为 Header|Payload|Signature,其中 Header 说明加密算法等,Payload 是用户信息,通常为用户 id,而 Signature 是使用自定义的私钥(PrivateKey 私钥只有你知道,泄露则被认为 JWT 失效!)加密 Header + Payload + PrivateKey 得到
  2. 鉴权时,Base64 解密 HeaderPayload,得到签名的不可逆加密算法,比如 HS256,并使用私钥加上加密算法重新加密 Header + Payload + PrivateKey 查看是否被篡改

通常登录后下发的 Token 由客户端存储,而浏览器中通常存在 LocalStorage 中,在发送请求时放在 Authentication 请求头中

参考资料

  1. [什么是JS跨域访问? - 前端私教年年的回答 - 知乎]https://www.zhihu.com/question/26376773/answer/2418353096
  2. 使用Express模拟并理解csrf攻击 - 大地dadi - 掘金
  3. 前端安全系列(二):如何防止CSRF攻击? - 美团技术团队
相关文章
|
1月前
|
JavaScript 安全 前端开发
js开发:请解释什么是XSS攻击和CSRF攻击,并说明如何防范这些攻击。
XSS和CSRF是两种常见的Web安全威胁。XSS攻击通过注入恶意脚本盗取用户信息或控制账户,防范措施包括输入验证、内容编码、HTTPOnly Cookie和CSP。CSRF攻击则诱使用户执行未经授权操作,防范手段有CSRF Tokens、双重验证、Referer检查和SameSite Cookie属性。开发者应采取这些防御措施并定期进行安全审计以增强应用安全性。
39 0
|
7月前
|
安全 NoSQL Java
互联网并发与安全系列教程(06) - 常见的Web安全漏洞(CSRF攻击)
互联网并发与安全系列教程(06) - 常见的Web安全漏洞(CSRF攻击)
85 0
|
8月前
|
SQL 安全 前端开发
渗透攻击实例-邪恶的CSRF(社会工程学)
渗透攻击实例-邪恶的CSRF(社会工程学)
|
1月前
|
缓存 安全 JavaScript
前端安全:Vue应用中防范XSS和CSRF攻击
【4月更文挑战第23天】本文探讨了在Vue应用中防范XSS和CSRF攻击的重要性。XSS攻击通过注入恶意脚本威胁用户数据,而CSRF则利用用户身份发起非授权请求。防范措施包括:对输入内容转义、使用CSP、选择安全的库;采用Anti-CSRF令牌、同源策略和POST请求对抗CSRF;并实施代码审查、更新依赖及教育团队成员。通过这些实践,可提升Vue应用的安全性,抵御潜在攻击。
|
2天前
|
存储 安全 JavaScript
【网络安全】CSRF攻击详解
【网络安全】CSRF攻击详解
|
4天前
|
安全 前端开发 Java
CSRF 攻击以及如何使用 Spring Security 预防攻击
【6月更文挑战第15天】CSRF 是指跨站请求伪造,是 Cross-site request forgery 的简称,有些地方也简写为 XSRF。
67 1
|
24天前
|
安全 Go 数据安全/隐私保护
CSRF 实验:无防御措施的 CSRF
CSRF 实验:无防御措施的 CSRF
|
1月前
|
存储 JavaScript 前端开发
Django的CSRF防攻击原理详解
Django的CSRF防攻击原理详解
|
1月前
|
安全 前端开发 JavaScript
在Python Web开发过程中:Web框架相关,如何在Web应用中防止CSRF攻击?
在Python Web开发中防范CSRF攻击的关键措施包括:验证HTTP Referer字段、使用CSRF token、自定义HTTP头验证、利用Web框架的防护机制(如Django的`{% csrf_token %}`)、Ajax请求时添加token、设置安全会话cookie及教育用户提高安全意识。定期进行安全审计和测试以应对新威胁。组合运用这些方法能有效提升应用安全性。
27 0
|
9月前
|
安全 PHP 开发者
CSRF 攻击的防范措施
CSRF 攻击的防范措施