我知道很多广告可以存储第三方 cookie,但是读取 cookie 呢?如果是这样,是什么阻止他们读取会话 ID 来执行会话劫持?
广告可以读取其所在网站的 cookie 吗?
页面中包含的任何脚本都可以读取所有未设置 httpOnly 属性的 cookie。脚本的访问限制不是根据加载脚本的域来确定的,而是根据加载脚本的页面来确定的。这意味着加载到页面中的所有脚本都对该页面具有相同的访问权和控制权,无论脚本的来源是什么。关于 cookie,这意味着您需要使用 httpOnly 保护任何敏感的 cookie,例如会话 ID,前提是您已将不受您控制和信任的第三方脚本包含在您的页面中。
但无论如何,将此类脚本包含到处理敏感数据的页面中并不是一个好主意,因为此类脚本不仅可以读取 cookie(除非 httpOnly),还可以从表单中提取信息(如登录凭据)或更改客户端应用程序逻辑。另请参阅我是否应该担心在银行网站上跟踪域?.
请注意,这些声明仅适用于直接包含在主页中的第三方脚本。如果脚本仅在主页内的第三方 iframe 内,则它既不能读取主页上的 cookie,也不能访问或修改其上的 DOM。
每个 cookie 都属于一个域(一个来源)。每个现代浏览器都实现了同源策略,以防止脚本访问与运行脚本不同的来源的 cookie(对子域有一些解决方法)。
如果是这样,是什么阻止他们读取会话 ID 来执行会话劫持?
如果somesite.example
以这种方式实现广告脚本...
<script src="https://rogueadvertisement.example/script.js"></script>
...没有什么可以阻止脚本访问和修改 cookie 上的 cookie somesite.example
,除非该 cookieHttpOnly
设置了标志。(此标志拒绝访问所有客户端脚本的 cookie,并使其仅可通过 HTTP 响应标头使用。)这是因为嵌入式脚本在嵌入站点的源上运行。
如果somesite.example
在框架中嵌入第三方广告...
<iframe src="https://rogueadvertisement.example/ad.html"></iframe>
...嵌入文档有自己的来源,框架内运行的脚本无法访问属于父文档域的 cookie。
此外,还有一些旋钮可以使嵌入可能不受信任的源更加安全,例如 HTML5沙盒属性。将其用作空属性...
<iframe sandbox src="https://rogueadvertisement.example/ad.html"></iframe>
... 强制执行各种附加限制,例如拒绝在框架内运行任何脚本。