同源策略:允许写入吗?

时间:2018-06-19 16:35:13

标签: javascript html security

我在MDN's description of the same-origin policy方面有点挣扎。

他们说:

  通常允许

跨域写入。...

     

通常允许

跨域嵌入。...

     

跨源读取通常不允许 ...

我了解第二个项目符号允许将跨域内容(例如CDN中的内容)标准嵌入到站点中:

  • <script src="...">
  • <link rel="stylesheet" href="...">

但是,允许写入是什么意思,不允许读取是什么意思? “写”是指我的网站写到另一个网站,还是相反的方向?与“阅读”相同,他们在说什么方向?一些例子将不胜感激。

2 个答案:

答案 0 :(得分:2)

MDN提供了有关写操作含义的示例:

  

示例包括链接,重定向和表单提交。某些很少使用的HTTP请求需要preflight

例如,我位于example.com的站点可以具有以下内容:

<form action="https://google.com/search" id="kittens-form" target="_blank">
<input type="hidden" name="q" value="kittens">
</form>

...并执行以下操作:

document.getElementById("kittens-form").submit();

Example on jsFiddle

((在这种情况下,由于我有target="_blank",因此我必须这样做是为了响应用户的操作,否则我将跳过弹出窗口阻止程序。但是,如果没有)打开一个新窗口,我可以随时执行此操作。)

  

与“阅读”相同,他们在那里谈论什么方向?

他们正在谈论在源A中运行的代码从源B中读取信息。因此,如果没有您的银行特别允许,我的恶意example.com网站无法从您的银行网站中读取CORS(这是因为您可能正在运行有效的银行业务会话,所以我无法窃取有关您的银行帐户的信息。)

此问题的更多答案:Same origin Policy and CORS (Cross-origin resource sharing)

答案 1 :(得分:0)

在关于 this saying 挣扎了半个小时后,我终于说清楚了:

<块引用>

通常允许跨域写入....

通常允许跨源嵌入....

通常不允许跨源读取...


根据是否与服务器交互,我更愿意将同源策略分为两种类型,而不是三种:

  1. 在浏览器中从 originB 中读取 originA 的已经加载的资源
  2. 在浏览器中从 originB 中请求 originA 的远程资源

第一个是“跨源读取”的情况,第二个是“跨源写入”和“跨源嵌入”的情况。

浏览器肯定会屏蔽第一种情况,使网站A的javascript代码片段无法读取网站B设置的cookie - 从而确保我们网络帐户的安全。

对于第二种情况,在很多情况下,请求是从一个源向另一个源发起的,例如:

  1. 指示浏览器请求另一个资源的 HTML <a href=... 标记
  2. HTML <form action=... method="POST"> 标记,使浏览器可以将表单发布到另一个网站
  3. 从另一个站点加载 CSS 样式并将其嵌入到我们自己的网页的 <link rel="stylesheet" href="…"> 标记
  4. 从别处加载图像并将其嵌入到我们自己的网页的 <img> 标记
  5. <script> 标签,它从别处加载 JavaScript 代码片段并嵌入到我们自己的网页中
  6. XMLHttpRequest AJAX 请求
  7. Web 字体(用于 CSS 中 @font-face 中的跨域字体使用)

浏览器允许 1-5 个场景,而块 6 和 7,浏览器也阻止了其他场景,您可以查看浏览器阻止的所有场景的 this link


(第一篇文章:https://cifer76.github.io/posts/same-origin-policy/