最近在看道哥的《白帽子讲web安全》,关于CSRF中的cookie读取部分闹不明白:
问题
cookie分为临时cookie(书里称为session-cookie)和本地cookie(书里称为the-third-cookie),临时cookie在set-cookie时没有限定时限,所以它保存在浏览器内存中,关闭浏览器即消失;本地cookie设定了时限,保存在本地,到达时限即消失。
书中首先指出,如果浏览器从一个域的页面中,要加载另一个域的资源,由于安全原因,某些浏览器会阻止本地cookie的发送,但不会阻止session cookie的发送。
书中做了实验,在http://www.a.com/cookie.php中,给浏览器写入两个cookie,一个临时,一个本地:
<?php
header("Set-Cookie:cookie1=123");
header("Set-Cookie:cookie2=456;expires=Thu,01-jan-2030 00:00:01 GMT;",false)
?>
那么浏览器获得了两个cookie,一个临时cookie1=123,一个本地cookie2=456。
此时在另外一个域中,有一个页面http://www.b.com/csrf-test.html,此页面构造了CSRF以访问www.a.com:
<iframe src="http://www.a.com"></iframe>
我们知道同源策略是允许通过src来加载资源的,但是在这里,临时的session被发送,本地cookie被浏览器阻止了。
IE出于安全考虑,默认禁止浏览器在<img>,<iframe>,<script>,<link>等标签中发送第三方cookie。
这里都没有问题,问题在于作者提到P3P头的问题时,举了个例子:
假设有www.a.com和www.b.com两个域,在www.b.com上有一个页面,其中包含一个指向www.a.comd iframe。
http://www.b.com/test.html的内容为:
<iframe width=300 height=300 src="http://www.a.com/test/php"></iframe>
http://www.a.com/test.php是一个对a.com域设置cookie的页面,内容为:
<?php
header("Set-Cookie:test=axis;domain=.a.com;path=/");
?>
当请求http://www.b.com/test.html时,iframe会跨域请求www.a.com/test.php。test.php会尝试Set-Cookie,所以浏览器会收到一个Cookie。
但是作者指出,这里set-cookie并不会成功,原因是同源策略的限制,所以当再一次请求http://www.b.com/test.html时,并不会发送刚才收到的Cookie,这里不论是临时cookie还是本地cookie。
我的困惑在于,这次实验和上次实验,同样是<iframe>标签,同样有同源策略的限制,为什么之前可以发送,而这次却无法发送。
原因
其实仔细分析一下,关键在于set-cookie步骤,两次试验的背景是不同的,第一次是在同域下set-cookie,即写入cookie成功的条件下,进行的访问。而第二次的实验set-cookie这一步直接是不成功的,当然是无法发送cookie了,因为它直接没有被写入。
那么接下来的问题就是它为什么写入没有成功,不是说<iframe>是可以跨域加载资源的吗,为什么又有同源策略的限制了呢?其实资源是成功加载了的,不然浏览器也不会收到set-cookie的cookie值,只是在将这个值配置上a.com的cookie时,浏览器遵循了同源策略,因为当前的页面是b.com的域。
关于cookie的同源策略,和普通的同源还有些不同,普通的同源我在之前的文章中有讲,但是cookie的同源,或者说是cookie的作用域是怎样的?
cookie同源策略(作用域)
这里我要推荐一下KCon的一篇文章《cookie之困》,文章指出:
即cookie仅以domain/path作为同源限制,那么这个domain和path的限制又是怎样的,作者指出:
domain的向上通配原则,即当前域名或父域名。
Path的向下通配原则,即当前路径或其父路径。
需要说明的是:
如果没有明确指明则默认为当前域名,比如通过访问www.vinceruan.info添加的Cookie的域名默认就是www.vinceruan.info,通过访问blog.vinceruan.info所生成的Cookie的域名就是blog.vinceruan.info。(from cookie安全和棋作用域)
总结
cookie之困这篇文章对cookie和其安全问题解释得很全面,值得一看,不过需要一点基本功。个人觉得cookie的同源问题(作用域)还是很重要的,写入和读取的规则遵循这些原则,在安全方面有很重要的作用。
网友评论