热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

说说XSRF防范

这是我在知乎的一个回答。原提问是如何在单页应用下进行XSRF防护。XSRF(CSRF)攻击的原理是什么?就是攻击者能猜测出所有的需要提交的内容以及类型,

这是我在知乎的一个回答。原提问是如何在单页应用下进行 XSRF 防护。

XSRF(CSRF) 攻击的原理是什么?就是攻击者能猜测出所有的需要提交的内容以及类型,所以所有的解决方案共同出发点就是加一个攻击者也不知道随机值发送给后端验证就可以防范。

有很多解决方案,COOKIE-session,很不友好的所有表单都得填写验证码,还有一种很少人知道 JSON Web Token。

验证码(图形或者手机)这种就不说了吧,这个在互联网场景中因为用户体验原因几乎没有应用的。

首先要知道直接让后端验证 COOKIE 是否存在正确是不可取的,因为所有请求都会自动附带请求所在域的 COOKIE,当然只验证 http referer 也是不靠谱的。

正确的方式是当用户进行登录请求的时候,这时候后端应该把包含 xsrf 字段的 COOKIE 保存在 session 中并且返还给前端,前端需要获取到 COOKIE 中的值并且能放入 ajax 请求体或请求头中,后端把这个值与 session 中的相应值进行判断就可以了,根据跨域不可访问不同域的 COOKIE ,攻击者也很难猜测出 xsrf 的值,那么这样就防范了 xsrf 攻击。

所以这里对 xsrf COOKIE 不能设置 httpOnly(当然就会有 XSS 问题,后面会提),同时提一句所以的 Token 必须得让后端设置 expire 过期时间。

这个 axios 就提供了这个功能,只要设置约定好 xsrf COOKIE字段名就可以了,axios 获取到值后默认是放入 request header 中,这也是业界最流行的方式。

如果不是单页应用都是后端在表单中加入一个隐藏的表单域。

<input type&#61;"hidden" name&#61;"_token" value&#61;"lAfHB..">

当然还有JWT&#xff0c;这个主要应用场景是 app&#xff0c;因为 app 通常没有 COOKIE&#xff0c;当然也有应用到 Web 中的&#xff0c;要讲这个就有点多了&#xff0c;和上述也差不多。

简单说&#xff0c;JWT 就是服务端和客户端约定好一个Token格式&#xff0c;最后用密钥进行签名 base64 编码后放入请求头即可&#xff0c;客户端存放这个签名的内容通常会放在 localstorage 中&#xff0c;也有放在 COOKIE 中的。JWT应用了哈希签名的密码学技术&#xff0c;相比 COOKIE-session 的方式就是服务端可以不用&#xff08;在内存或者缓存&#xff09;存放 session&#xff0c;能节省存储资源&#xff0c;不过同时服务器需要通过计算来验证也浪费了计算资源。详细的说明可以参考&#xff1a;讲真&#xff0c;别再使用JWT了&#xff01;

现有的产品为了更安全还需要考虑 XSS 攻击&#xff0c;这个就是有些恶意脚本或者插件不存在跨域问题&#xff0c;所以能获取到 COOKIE 和 localstorage 的值。

很安全的方式就是把 XSRF Token 加入到 JWT 中&#xff0c;并且把 JWT 存放在设置 httpOnly 的 COOKIE 中&#xff0c;然后单独把 XSRF Token (一般而言就是一个随机值)设置在 httpOnly&#61;false 的 COOKIE 中&#xff0c;前端请求时&#xff0c;需要获取 XSRF Token 并放入请求头&#xff08;RequestHeader&#xff09;。服务器端可以直接验证JWT中XSRF的值和XSRF的值即可。因为用了哈希密钥签名的技术&#xff0c;这样就可以防止篡改内容。

这样的安全防护就能抵御所有的 XSRF 攻击了。



推荐阅读
  • 在探讨SpringCloud环境中实现跨标签页或新窗口的单点登录机制时,重点分析了localStorage与sessionStorage的应用。通过使用localStorage存储token,可以确保其在浏览器关闭后仍有效,但需手动设置过期时间以增强安全性。相比之下,sessionStorage仅在当前会话期间有效,适用于临时数据存储。文中详细讨论了两种存储方式的技术细节及其在实际开发中的应用策略。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • 初次接触AJAX是在去年,当时主要是通过手动编写客户端代码来实现,还需处理被请求的页面,过程相当繁琐。尽管之前就听说过AJAX.NET,但一直没有机会深入了解。本文将作为初学者的指南,详细介绍AJAX.NET的基本概念、核心功能及其在实际项目中的应用技巧,帮助读者快速上手并掌握这一强大的开发工具。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • Laravel 与 Vue 实现前后端分离时的跨域解决方案探析
    Laravel 与 Vue 实现前后端分离时的跨域解决方案探析 ... [详细]
  • 本文深入探讨了在使用 Spring Cloud Feign 时遇到的 `java.lang.IllegalStateException` 异常,具体表现为方法体参数过多的问题。通过详细分析异常原因和代码结构,提出了有效的解决方案,帮助开发者更好地理解和处理这一常见问题。 ... [详细]
  • 探索JavaScript倒计时功能的三种高效实现方法及代码示例 ... [详细]
  • 在本文中,我们将探讨如何使用 UniApp 封装小程序 API 请求接口的最佳实践。通过创建 `request.js` 文件,定义基础 URL 并传入后端提供的 URL 作为请求参数。同时,配置请求方法(如 GET、POST)和请求头(例如包含 token 的认证信息),以实现高效、安全的 API 调用。此外,我们还将介绍如何处理请求和响应的错误,以及如何优化请求性能,确保应用在不同平台上的兼容性和稳定性。 ... [详细]
  • Django框架进阶教程:掌握Ajax请求的基础知识与应用技巧
    本教程深入探讨了Django框架中Ajax请求的核心概念与实用技巧,帮助开发者掌握异步数据交互的方法,提升Web应用的响应速度和用户体验。通过实例解析,详细介绍了如何在Django项目中高效实现Ajax请求,涵盖从基础配置到复杂场景的应用。 ... [详细]
  • HTML5 Web存储技术是许多开发者青睐本地应用程序的重要原因之一,因为它能够实现在客户端本地存储数据。HTML5通过引入Web Storage API,使得Web应用程序能够在浏览器中高效地存储数据,从而提升了应用的性能和用户体验。相较于传统的Cookie机制,Web Storage不仅提供了更大的存储容量,还简化了数据管理和访问的方式。本文将从基础概念、关键技术到实际应用,全面解析HTML5 Web存储技术,帮助读者深入了解其工作原理和应用场景。 ... [详细]
  • 浏览器与服务器在网站访问过程中的数据交互分析
    本文分析了浏览器与服务器在网站访问过程中基于HTTP协议的数据交互机制。HTTP协议具有轻量级和高效通信的特点,主要通过GET、HEAD和POST方法进行数据传输。其“请求-响应”模式确保了数据交互的有序性和可靠性,同时支持多种数据格式和内容类型,为现代Web应用提供了坚实的基础。 ... [详细]
  • Spring 中获取 Request 的多种方式及其线程安全性的深入解析
    本文深入探讨了在Spring MVC框架下获取HTTP请求对象的多种方法,详细分析了每种方法的实现原理及其线程安全性,为开发者提供了全面的技术参考。 ... [详细]
  • 链游未来前景广阔,潜力无限 ... [详细]
  • Cookie是一种小型数据文件,由Web服务器生成并存储在用户的浏览器中。当用户再次访问同一服务器时,这些数据可以被重新读取,为用户提供个性化的体验。Cookie在软件测试中具有重要作用,能够帮助测试人员验证会话管理、用户偏好设置等功能的正确性和安全性。通过深入解析Cookie的工作原理及其在不同场景下的应用,本文旨在为软件测试人员提供全面的技术指导。 ... [详细]
author-avatar
手机用户2502941301
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有