外行术语中的同源策略
Posted
技术标签:
【中文标题】外行术语中的同源策略【英文标题】:Same Origin Policy in Layman Terms 【发布时间】:2012-07-13 12:45:21 【问题描述】:谁能帮助我更好地理解同源政策。我看过几个描述它的网站,但我正在寻找一个更简单的解释,你会如何向孩子描述它?
这个link 似乎做得最好。任何人都可以扩展吗?有人可以解释为什么存在这项政策吗?
【问题讨论】:
你试过Wikipedia吗? 是的,我不想承认,但我仍然对此感到困惑。而且我找不到任何明确的理由为什么这个政策甚至存在 尝试阅读 CSRF。这就是为什么。 为了在此处添加答案,实际上可以使用需要在双方(客户端和服务器)都存在的特殊标头绕过此问题。在这里阅读:developer.mozilla.org/en/http_access_control 【参考方案1】:需要同源策略来防止CSRF。想象一下这种情况:
-
银行经理 Joe Fatcat 在其银行的管理后端有一个帐户。该帐户使他可以访问在 TBtF 银行开户的任何人的机密帐户信息。他甚至可以重置某人的密码、转移资金、更改帐户所有权等。
现在,TBtF 银行解雇了 IT 专家杰克。现在他是愤愤不平的前 IT 人杰克,他想报复他的前雇主。 Jack 无权访问银行的管理后台,但他知道 Joe 可以。
因此,Jack 向他的老板发送了一封电子邮件,其中包含指向 Jack 创建的页面的链接。在页面上,有一些 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);
-
第二天,Joe 到达他的办公室并像往常一样登录到他的管理帐户,并在后台保持选项卡处于打开状态。
乔看到一封电子邮件,其中包含指向娜塔莉·波特曼 (Natalie Portman) 的照片的链接。所以他很自然地点击它,打开了恶意网页。
浏览器在页面上运行 JavaScript 并向 TBtF 银行的管理后端站点发出 AJAX POST 请求。由于 Joe 已经登录到该站点并且有一个活动会话,因此银行应用程序接受了该命令并将大量美元汇入 Jack 的离岸银行账户。
Jack 可以同样轻松地使用相同的技术来获取数千个帐号和密码或银行经理可以通过其帐户访问的任何其他信息。
幸运的是,同源策略在大多数情况下都可以保护我们免受此类攻击,因为 Jack 的恶意页面托管在与银行应用程序不同的域中,因此不允许对银行应用程序进行 XHR。尽管恶意页面仍可能包含向银行应用程序发出 GET 请求的图像,但重要的是不要通过 GET 请求启动具有副作用的操作,并且应用程序检查它们收到的请求的引用标头并利用反CSRF 令牌。
【讨论】:
+1,这是 CSRF 的一个很好的例子。另外,为什么我在读完这篇文章后谷歌“娜塔莉·波特曼满身热砂”=/ 这正是我所希望的。非常感谢!【参考方案2】:基本上这意味着 - 只有来自同一域的脚本才能不受限制地访问彼此的对象和属性(因此,如果您有一个定义了命名函数的 .js
文件,您可以从托管的任何其他文件调用它同一个域)。
因此,如果您从不同域限制提供脚本请应用。
之所以存在此政策,是因为很容易将链接注入到不同域中的 javascript 文件(例如一些注入此类文件链接的 javascript 代码)。这是一个安全风险 - 您真的只希望执行来自您所在站点的代码,而不仅仅是任何外部代码。
【讨论】:
only scripts that are served from the same domain can access each others objects
。那么,为什么你可以在 CDN 中包含 jQuery 并让它访问你页面上的 DOM?
@Rocket:正确。重要的是脚本执行的页面域,而不是 JS 文件的托管位置。事实上,在CORS
标准化之前,JSONP 是您发出跨域 AJAX 请求的方式,它基本上链接到一个异地 JS 文件,作为从另一个域(以 JSON 形式)获取数据的一种方式。跨度>
以上是关于外行术语中的同源策略的主要内容,如果未能解决你的问题,请参考以下文章