8

有人可以帮助我更好地理解同源政策。我看过几个描述它的网站,但我正在寻找一个更简单的解释,你会如何向孩子描述它?

这个链接 似乎做了我发现的最好的工作。任何人都可以扩展吗?有人能解释为什么这个政策存在吗?

4

2 回答 2

27

需要同源策略来防止CSRF。想象一下这个场景:

  1. 银行经理 Joe Fatcat 在其银行的管理后台有一个帐户。该帐户使他可以访问在 TBtF 银行开户的任何人的机密帐户信息。他甚至可以重置某人的密码、转移资金、更改帐户所有权等。
  2. 现在,TBtF 银行解雇了 ​​IT 专家杰克。现在他是愤愤不平的前 IT 人杰克,他想报复他的前雇主。Jack 无权访问银行的管理后台,但他知道 Joe 可以。
  3. 因此,杰克向他的老板发送了一封电子邮件,其中包含指向杰克创建的页面的链接。在页面上,有一些 JavaScript,例如:


var xhr = new XMLHttpRequest(),
    data = "from="+victimAccount
           + "&to="+jacksAccount
           + "&amt=a+gazillion+dollars";
xhr.open("POST", "http://tbtfbank.tld/accounts/wiretransfer.aspx", true);
xhr.send(data);
  1. 第二天,Joe 到达他的办公室并像往常一样登录到他的管理帐户,并在后台保持选项卡处于打开状态。
  2. 乔看到一封电子邮件,其中包含指向娜塔莉·波特曼(Natalie Portman)的照片的链接。所以他很自然地点击它,打开了恶意网页。
  3. 浏览器在页面上运行 JavaScript 并向 TBtF 银行的管理后端站点发出 AJAX POST 请求。因为 Joe 已经登录到该站点并且有一个活动会话,所以银行应用程序接受该命令并将大量美元汇入 Jack 的离岸银行帐户。

杰克本可以很容易地使用相同的技术来收集数千个帐号和密码或银行经理可以通过他的帐户访问乔的任何其他信息。

幸运的是,同源策略在大多数情况下保护我们免受这些类型的攻击,因为 Jack 的恶意页面托管在与银行应用程序不同的域中,因此不允许对银行应用程序进行 XHR。尽管恶意页面仍可能包含向银行应用程序发出 GET 请求的图像,但重要的是不要通过 GET 请求启动具有副作用的操作,并且应用程序检查它们收到的请求的引用标头并利用反CSRF 代币。

于 2012-07-13T16:58:32.040 回答
5

基本上这意味着 - 只有来自同一域的脚本才能不受限制地访问彼此的对象和属性(因此,如果您有一个.js定义了命名函数的文件,您可以从托管在同一域上的任何其他文件中调用它)。

因此,如果您提供来自不同域限制的脚本,务必应用。

之所以存在此策略,是因为将链接注入到不同域中的 javascript 文件(例如一些注入此类文件的链接的 javascript 代码)太容易了。这是一个安全风险——您真的只想要来自您所在站点的代码来执行,而不仅仅是那里的任何代码。

于 2012-07-13T16:27:36.260 回答