关键词

跨域

前言

最近在挖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

打开网易新闻 查看精彩图片

指的一提的是,一般情况下如果设置SameSite为None,也要同时设置Secure,否则一些浏览器可能会拒绝仅有SameSite=None的设置。

打开网易新闻 查看精彩图片

在不同浏览器上的实验

上面的描述只是标准,具体的效果还要依赖于浏览器的实现,这里进行一波实验来验证一下上述和标准和各个浏览器的实现。

先使用小皮面板创建两个站点,test1.com和test2.com,test1.com注意设置为https访问。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

在test1.com上部署一个设置cooke的前端页面test1.com/cookieSetting.html和一个后端处理脚本test1.com/getCookie.php,还有一个测试cookie是否携带的页面test1.com/json.php,如果携带cookie就会返回账户密码,否则返回error。在test2.com则部署一个跨域测试的html页面crossSite.html,来测试各种跨域的cookie携带情况

打开网易新闻 查看精彩图片

关于CSRF、JSONP和CORS的cookie跨域

经过上面的分析,在什么时候可以进行跨域其实已经很明了了

  • CSRF使用get和input进行跨域,当使用get进行跨域时,除了SameSite=strick的情况,都可以携带cookie;当使用post进行跨域时,按照标准,只有SameSite=None和Secure被设置时才能携带cookie。但是由于很多浏览器的实现不标准或者对于不设置SameSite的处理较为模糊,有时不设置SameSite或设置SameSite=None而不设置Secure时允许input跨域携带cookie,这要视浏览器的实现而定。

  • JSONP劫持依赖