我对MDN关于同源策略的描述有些困惑。
他们说:
通常允许跨域写入....
通常允许跨域嵌入....
通常不允许跨域读取...
我理解第二个项目允许标准嵌入跨域内容(例如来自CDN的内容)到网站中:
<script src="...">
<link rel="stylesheet" href="...">
但是,“允许写入”和“不允许读取”是什么意思? “写入”是否指我的网站向另一个网站写入,还是反向操作?同样,“读取”指的是哪个方向?非常感谢提供一些示例。
我对MDN关于同源策略的描述有些困惑。
他们说:
通常允许跨域写入....
通常允许跨域嵌入....
通常不允许跨域读取...
我理解第二个项目允许标准嵌入跨域内容(例如来自CDN的内容)到网站中:
<script src="...">
<link rel="stylesheet" href="...">
但是,“允许写入”和“不允许读取”是什么意思? “写入”是否指我的网站向另一个网站写入,还是反向操作?同样,“读取”指的是哪个方向?非常感谢提供一些示例。
MDN给出了什么是“writes”的示例:
示例包括链接、重定向和表单提交。某些很少使用的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"
,我必须响应用户操作才能打开新窗口,否则会触发弹出窗口拦截器。但如果我不打开新窗口,我可以随时使用它。)
同样的,“read”指的是什么方向?
他们谈论运行在 A 点源的代码从 B 点源中读取信息。所以,我的恶意 example.com
网站不能在没有您的银行明确允许的情况下通过CORS从您的银行网站读取信息(这样我就无法窃取您的银行账户信息,因为您的银行会话可能正在运行...)。
更多详细信息,请参见此问题的答案:Same origin Policy and CORS (Cross-origin resource sharing)
<a href="...">...</a>
,当提到 link
元素时,需要更具体的描述而不仅仅是使用 "link" 这个词。但在这两种情况下,信息(URL 和可能的查询字符串参数)都会被发送到目标站点,目标站点可以使用它们。因此,在某种程度上,这是向目标站点“写入”信息,目标站点可以“读取”该信息。 - T.J. Crowderdocument.domain
,否则你不能在浏览器中修改从不同来源加载的文档的 DOM,即使是在相当有限的情况下也不行。) - T.J. Crowderconst newWin = window.open('https://www.google.com', 'windowName');
,然后按照我想要的方式写入它的DOM。但我知道这是不可能的,因此感到困惑:) 再次感谢。 - Magnus
- 通常允许跨域写入……
- 通常允许跨域嵌入……
- 通常不允许跨域读取……
<a href=...
标签<form action=... method="POST">
标签<link rel="stylesheet" href="…">
标签<img>
标签<script>
标签XMLHttpRequest
AJAX 请求
<form>
提交一样的操作。这些操作被浏览器允许,也是浏览器本身无法解决CSRF问题的原因。 - PointyCSRF
令牌吗?编辑:我想这是有道理的,以避免从恶意来源读取。我实际上还没有实现这样的通信,所以不确定它是如何完成的/我的问题是否有意义。 - Magnus