Cookie-SameSite属性详解(CSRF攻击、同站和跨站;跨子域)
2022/3/28 6:24:16
本文主要是介绍Cookie-SameSite属性详解(CSRF攻击、同站和跨站;跨子域),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、CSRF攻击
我们知道cookie作为标识用户身份的存在,可以帮助我们不需要输入账号密码进行登录就可以完成认证执行某些操作;假设我们在访问第三方网站时,网站页面存在一条ajax请求是Post请求地址为:执行银行账户的转账操作,由于你的浏览器内包含cookie,那么这条请求就会携带cookie然后请求就会被执行;
二、同站和跨站
这边对于同站的理解非常重要:
Cookie中的同站:只要两个url地址的有效顶级域名+二级域名是相同的就算是同站,例如www.a.smile.com 和 www.b.smile.com 是同站,而www.taobao.com 和 www.baidu.com非同站;a.github.io 和 b.github.io 是跨站(原因:.com是一级域名,github.io是二级域名)。
三、Samesite存在的作用
既然我们知道了同站和跨站的区别,SameSite存在的意义就是去防止CSRF攻击,我们去思考一下,如果是你会怎么设计,再联想一下刚才的同站,我们肯定想只要在我的站内都是允许你携带cookie,这样才能保证更好的用户体验,主要我注册了二级域名,表明这个是我的站,在我的站内自然允许cookie携带,之前我也想过会不会有有人恶意注册二级域名,当然,这个二级域名不是想注册就能注册的;
四、Samesite三个属性
之前看的一篇博客写的是只有当前网页和url和请求目标一致,才会带上cookie,经过测试发现跨子域也是没有问题的,即当前网址为backend.smile.com请求网址为front.smile.com是没有问题的,是允许的,因为是同站;
五、测试
5.1、一开始浏览器中没有cookie;
//判断浏览器中有误cookie @GetMapping("/index") public Object sameSite(HttpServletRequest request){ Cookie[] cookies = request.getCookies(); if(cookies != null){ for(Cookie cookie:cookies){ System.out.println(cookie.getName()); } }else{ System.out.println("没有cookie"); } return "ok"; }
5.2、设置cookie以及相关参数;
//通过访问/testcookie进行cookie参数的设置 @GetMapping("/testcookie") public Object test (HttpServletRequest request, HttpServletResponse response) throws Exception { ResponseCookie cookie = ResponseCookie.from("myCookie", "myCookieValue") // key & value .httpOnly(false) // 禁止js读取 .secure(true) // 在http下也传输 .domain("front.smile.com")// 可信域 .path("/") // path .maxAge(Duration.ofHours(1)) // 1个小时候过期 .sameSite("Strict") // 大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外 .build() ; // //对response可以对设置请求头设置Cookie Header response.setHeader(HttpHeaders.SET_COOKIE, cookie.toString()); System.out.println("设置好cookie啦"); return "ok"; }
5.3、验证非同站是否会携带成功;设置hosts映射为以下:
规律:跨子域是没有问题的例如backend.smile.com front.smile.com front122.smile.com;
但是在这种情况下不行front122.smile11.com backend.smile.com;
SameSite-Lax:与strict类似,跨子域是没有问题的,但是非子域就不会携带cookie;
这篇关于Cookie-SameSite属性详解(CSRF攻击、同站和跨站;跨子域)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享