关键词
跨域
前言
最近在挖SRC时遇到了JOSNP和CORS,但是进行JSONP劫持和CORS跨域请求的尝试却失败了,后来经过研究发现根本原因是cookie跨域的限制造成了,遂有了这篇文章。
关于cookie跨域的分析 影响cookie跨域的samesite和secure
2016年开始,Chrome 51版本对Cookie新增了一个 SameSite属性,为了防止CSRF
攻击,陆续的各大厂商的浏览器也都适配了该属性,该属性限制了在不同情况下cookie的跨域。而Secure则是规定了cookie是否可以在http下传输,如果Secure为true,则仅在使用https时才会携带cookie。
下图为不同SameSite设置的效果,当然也可以不设置SameSite,大多数浏览器在不设置SameSite时默认为Lax
![](http://dingyue.ws.126.net/2024/0325/6931eebaj00sawlzi0014d200j6007yg00it007s.jpg)
指的一提的是,一般情况下如果设置SameSite为None,也要同时设置Secure,否则一些浏览器可能会拒绝仅有SameSite=None的设置。
![](http://dingyue.ws.126.net/2024/0325/4a560ebcj00sawlzj000od200j6005ug00it005q.jpg)
在不同浏览器上的实验
上面的描述只是标准,具体的效果还要依赖于浏览器的实现,这里进行一波实验来验证一下上述和标准和各个浏览器的实现。
先使用小皮面板创建两个站点,test1.com和test2.com,test1.com注意设置为https访问。
![](http://dingyue.ws.126.net/2024/0325/190bfb45j00sawlzj000md200c800bsg00c800bs.jpg)
![](http://dingyue.ws.126.net/2024/0325/e3588a87j00sawlzj000od200c900c8g00c900c8.jpg)
在test1.com上部署一个设置cooke的前端页面test1.com/cookieSetting.html和一个后端处理脚本test1.com/getCookie.php,还有一个测试cookie是否携带的页面test1.com/json.php,如果携带cookie就会返回账户密码,否则返回error。在test2.com则部署一个跨域测试的html页面crossSite.html,来测试各种跨域的cookie携带情况
![](http://dingyue.ws.126.net/2024/0325/f5d35627j00sawlzk001od200h100nwg00h100nw.jpg)
关于CSRF、JSONP和CORS的cookie跨域
经过上面的分析,在什么时候可以进行跨域其实已经很明了了
CSRF使用get和input进行跨域,当使用get进行跨域时,除了SameSite=strick的情况,都可以携带cookie;当使用post进行跨域时,按照标准,只有SameSite=None和Secure被设置时才能携带cookie。但是由于很多浏览器的实现不标准或者对于不设置SameSite的处理较为模糊,有时不设置SameSite或设置SameSite=None而不设置Secure时允许input跨域携带cookie,这要视浏览器的实现而定。
JSONP劫持依赖
热门跟贴