| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 10 SpringSecurity-跨域请求伪造(CSRF)的防护 -> 正文阅读 |
|
[网络协议]10 SpringSecurity-跨域请求伪造(CSRF)的防护 |
文章配套代码:https://gitee.com/lookoutthebush/spring-security-demo 一、CSRFCSRF的全称是(Cross Site Request Forgery),可译为跨域请求伪造,是一种利用用户带登录 态的cookie进行安全操作的攻击方式。CSRF实际上并不难防,但常常被系统开发者忽略,从而埋下巨 大的安全隐患。 二、攻击过程举个例子,假设你登录了邮箱,正常情况下可以通过某个链接http:xx.mail.com/send可以发送邮件。此时你又访问了别的网站,网站中有黄色广告,点击后广告会请求http:xx.mail.com/send。此时相当于在盗版网站中调用了发送邮件的链接,访问时会使用你邮箱网站的cookie信息。虽然盗版网站会提示跨域,但服务端任然进行了相应处理。 三、防御手段在任何情况下,都应当尽可能地避免以GET方式提供涉及数据修改的API。并不是说其他请求方式可以避免CSRF,只是GET请求更容易被攻击。 在此基础上,防御 CSRF攻击的方式主要有以下两种。 1.HTTP RefererHttp referer是由浏览器添加的一个请求头字段,用于标识请求来源,浏览器端无法轻易篡改该值。 比如攻击者在第三方页面构造了POST请求,htttp referer不是我们网站的地址(有的老版IE浏览器可以修改该值,如果用户的浏览器比较新,就能避免这个问题),当服务端收到请求,发现请求来自其他站点,就能拒绝该请求。 这种方式简单便捷,但不是完全可靠,比如老的浏览器就能修改该值。用户在浏览器设置了不被跟踪,就不会有该字段,服务端加了校验后就会拦截掉用户的正常请求。 2.CsrfToken认证CSRF是利用用户的登录态进行攻击的,而用户的登录态记录在cookie中。其实攻击者并不知道用 户的cookie存放了哪些数据,于是想方设法让用户自身发起请求,这样浏览器便会自行将cookie传送到 服务器完成身份校验。 CsrfToken 的防范思路是,添加一些并不存放于 cookie 的验证值,并在每个请求中都进行校验, 便可以阻止CSRF攻击。 具体做法是在用户登录时,由系统发放一个CsrfToken值,用户携带该CsrfToken值与用户名、密码 等参数完成登录。服务端记录该会话的CsrfToken值,之后在用户的任何请求中,都必须带上该 CsrfToken值,并由系统进行校验。 该方案需要前端配合,包括存储CsrfToken的值,在每次的请求中,不管是form表单还是ajax,都需要携带该token。虽然比HTTP Referer安全很多,但也有弊端,如果在已有系统进行改造,就需要修改每一个请求,所以建议在系统开发之初就考虑防御CSRF攻击。 三、使用SpringSecurity防御CSRFcsrf攻击完全是基于浏览器的,如果前端没有浏览器,也就不会有CSRF攻击了,所以我们需要关闭SpringSecurity自动配置的csrf。 ?1.SpringSecurity防御CSRF过程CsrfFilter: SpringSecurity通过注册一个CsrfFilter来专门处理CSRF攻击。 CsrfToken: 用该接口来定义csrftoekn所需的一些必要方法。
CsrfTokenRepository 定义了如何生成,保存、以及加载token.
HttpSessionCsrfTokenRepository 默认情况下,SpringSecurity使用的CsrfTokenRepository的实现类是HttpSessionCsrfTokenRepository
HttpSessionCsrfTokenRepository将CsrfToken值存储在HttpSession中,并指定前端把CsrfToken 值放在名为“_csrf”的请求参数或名为“X-CSRF-TOKEN”的请求头字段里(可以调用相应的设置方法来重新设定)。校验时,通过对比HttpSession内存储的CsrfToken值与前端携带的CsrfToken值是否一致,便能断定本次请求是否为CSRF攻击。 前端使用Token的时候,必须使用从服务端渲染的方式,比如jsp页面:
CookieCsrfTokenRepository Spring Security还提供了另一种方式,即CookieCsrfTokenRepository。之前是服务端将token存储在了session中。这个是将token存储在浏览器的cookie中,这样可以减少服务端的内存消耗,而且前端可以使用js读取(需要设置该cookie的httpOnly属性为false),更加灵活。 有人可能会有疑问,放在cookie中,不是又可以被攻击了吗?其实不是的。 cookie只有在同域的情况下才能被js获取。正常情况下,服务端从cookie中获取token,前端使用js从cookie中获取token,2者进行校验。攻击者只能在第三方页面伪造请求的时候,利用请求携带cookie,这个时候服务端能拿从携带的cookie中拿到token,但是前端并没有使用js将用于校验的token传给服务端(攻击者没法获取cookie),所以校验没法通过。 CsrfFilter 现在我们重新来看这个类的主要逻辑:
这段代码的意思就是, 从你指定或者默认的的CsrfTokenRepository中获取token,其实就是获取的服务端存储的token(session中或者cookie中),如果没有,那么就生成并且保存token,然后获取前端传过来的token,然后进行对比。 2.SpringSecurity配置CSRF1.我们使用cookie的方式存储token. ?2.添加AccessDeniedHandler 用来在token请求不通过的时候,返回数据。
?3. 前端修改 生成的token:
?3.启动项目测试启动项目,登录成功,跳转页面。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 7:33:56- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |