我在MDN's description of the same-origin policy方面有点挣扎。
他们说:
通常允许跨域写入。...
通常允许跨域嵌入。...
跨源读取通常不允许 ...
我了解第二个项目符号允许将跨域内容(例如CDN中的内容)标准嵌入到站点中:
<script src="...">
<link rel="stylesheet" href="...">
但是,允许写入是什么意思,不允许读取是什么意思? “写”是指我的网站写到另一个网站,还是相反的方向?与“阅读”相同,他们在说什么方向?一些例子将不胜感激。
答案 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();
((在这种情况下,由于我有target="_blank"
,因此我必须这样做是为了响应用户的操作,否则我将跳过弹出窗口阻止程序。但是,如果没有)打开一个新窗口,我可以随时执行此操作。)
与“阅读”相同,他们在那里谈论什么方向?
他们正在谈论在源A中运行的代码从源B中读取信息。因此,如果没有您的银行特别允许,我的恶意example.com
网站无法从您的银行网站中读取CORS(这是因为您可能正在运行有效的银行业务会话,所以我无法窃取有关您的银行帐户的信息。)
此问题的更多答案:Same origin Policy and CORS (Cross-origin resource sharing)
答案 1 :(得分:0)
在关于 this saying 挣扎了半个小时后,我终于说清楚了:
<块引用>通常允许跨域写入....
通常允许跨源嵌入....
通常不允许跨源读取...
根据是否与服务器交互,我更愿意将同源策略分为两种类型,而不是三种:
第一个是“跨源读取”的情况,第二个是“跨源写入”和“跨源嵌入”的情况。
浏览器肯定会屏蔽第一种情况,使网站A的javascript代码片段无法读取网站B设置的cookie - 从而确保我们网络帐户的安全。
对于第二种情况,在很多情况下,请求是从一个源向另一个源发起的,例如:
<a href=...
标记<form action=... method="POST">
标记,使浏览器可以将表单发布到另一个网站<link rel="stylesheet" href="…">
标记<img>
标记<script>
标签,它从别处加载 JavaScript 代码片段并嵌入到我们自己的网页中XMLHttpRequest
AJAX 请求浏览器允许 1-5 个场景,而块 6 和 7,浏览器也阻止了其他场景,您可以查看浏览器阻止的所有场景的 this link。