为什么 <img> 调用不违反同源策略?

信息安全 Web应用程序 网页浏览器 javascript html 同源策略
2021-08-25 18:02:14

我对同源政策(SOP)的主题有点困惑。如果我理解正确,SOP 的目的是防止一个页面访问另一个网页上的敏感数据。

例如,为什么我可以简单地从不同的来源获取敏感图像?这将违反 SOP 的想法。

4个回答

这被认为是可以接受的,因为脚本在与跨源图像交互方面受到限制,除非crossorigin="anonymous"设置,它告诉浏览器在检索图像时不要发送 cookie 或其他凭据。由于画布被污染crossorigin="anonymous",允许脚本在不设置的情况下从图像中检索尺寸,但不能检索像素数据

这在理论上是可以的,尽管过去曾发生过泄漏像素数据的侧信道攻击

该应用无法从 IMG 标签中获取任何敏感数据。例如,如果您尝试使用<canvas>标签读取像素数据,浏览器应该抛出 SOP 异常,除非使用了 CORS。由于图像可以(由人类用户)查看,但不能以编程方式检查(通过 JS 代码),因此图像策略被认为“足够好”

我应该指出,可以从远程图像中获取图像尺寸,这可能被认为是敏感信息,特别是在动态图像 url 上,显示不同尺寸的“好/坏”图像,这些图像会根据某些状态而改变。尽管如此,这是非常少量的信息,通常不是隐私问题 - 而且,它很难隐藏,因为图像尺寸通常可以通过它们如何影响页面布局(脚本可以访问)得出。

更改此政策将破坏大量网站,这些网站需要“深度链接”才能显示来自内容交付网络、imgur 等的资产。

同源策略不是一些统一的干净公理:它实际上是一组特定的规则和特殊情况,这些规则和特殊情况已成为现代 Web 的化石。您无法使用正确捕获基本细节的简短描述来定义同源策略:特殊情况在实践中实际上很重要。

cookie 的规则是 JS 的规则,它们甚至没有被完美地定义和独立于浏览器。由于这些僵化的规则,Cookie 在现代 Web 中的保护非常薄弱,这些规则必须在安全 Web 识别的设计中加以考虑:

  • cookie 允许的子域之间的通信程度非常有用(一个子域可以设置一个由另一个子域使用的 cookie)但也是一个潜在的混淆源,因为浏览器不会发回带有设置的域名称的 cookie它。
  • 在 http 网页上设置的 cookie 将在 https 网页上的同一域上发回,而不会指明来源。

相反,可以在浏览器存储(连同“cookie jar”)上存储数据(如 localStorage 和 sessionStorage)的现代 Web 技术是严格按来源与确切的域和 URL 方案隔离的。

包含来自另一个站点的图像不必使用具有指定尺寸的对象来完成(与由框架集页面或托管 iframe 的页面指定布局的框架元素不同),因此布局取决于加载的图像;至少一个网页可以验证是否可以加载图像 URL,这有时可以判断用户是否登录了网站。

加载脚本和样式表的规则是特殊的;这是策略中的一个漏洞,对于与其他域交互很有用:从提供服务的域加载的脚本可以设置一些变量来存储计算结果。这种进行远程过程调用的非常肮脏的方式称为“JSONP”。

然后,有用于测量页面无权查看或测量的资源的加载时间的侧通道......

图像标签仅向目标发送 GET 请求并在目标是图像时获取内容。尝试在图像标签中嵌入包含敏感信息的页面,它会发送 GET 请求,但不会返回任何敏感信息。

Javascript 有可能将您发送到一个页面,并返回该页面的内容(使用 ajax 这可以完成)。

这显然是有问题的,因为某些页面将包含一些敏感信息,因此,只有在同一网站中的某些 API 和页面才有可能。