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攻击、同站和跨站;跨子域)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程