Chrome 中的 iframe 错误:无法从“窗口”读取“localStorage”:此文档的访问被拒绝
Posted
技术标签:
【中文标题】Chrome 中的 iframe 错误:无法从“窗口”读取“localStorage”:此文档的访问被拒绝【英文标题】:Iframe in Chrome error: Failed to read 'localStorage' from 'Window': Access denied for this document 【发布时间】:2015-08-09 11:35:39 【问题描述】:我有一个使用 localStorage 的网络应用程序。现在我们想通过 iframe 将这个 Web 应用程序嵌入到其他(第三方)网站上。我们希望提供类似于 youtube 的 iframe 嵌入,以便其他网站可以将我们的网络应用程序嵌入 iframe。从功能上讲,它就像不嵌入一样。但它不起作用。 Chrome 打印错误消息:
Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.
我只是做了以下检查(在 iframe 中):
if (typeof window.localStorage !== 'undefined')
// SETUP SESSION, AUHT, LOCALE, SETTINGS ETC
else
// PROVIDE FEEDBACK TO THE USER
我检查了 Chrome 中的安全设置,如 another *** Thread 中所述,但它不起作用。是否有任何更改可以在不需要调整大多数现代浏览器的(默认)安全设置的情况下进行嵌入?
为了提供更多信息,我们将 Ember-CLI 用于我们的 Web 应用程序并打开了 CSP (more info about the Ember-CLI CSP)。 CSP 会导致我们的网络应用抛出安全错误吗?
【问题讨论】:
你的标题提到了iframe
? iframe 中有什么东西试图访问本地存储吗?听起来可能会触发安全警告?
@Grapho:我重新表述了我最初的问题。我们只想为其他网站提供通过iframe
嵌入我们的网络应用程序的可能性。所以window.localStorage
调用在我们的网络应用程序代码中,因此在iframe
中。我们不想做任何花哨的跨域事情。只需通过 iframe 使我们的网络应用程序可用。希望这可以澄清问题。
如果网络应用使用本地存储,那么在 iframe 中运行它会导致跨域问题,因为 Window 是全局的...它将尝试访问本地客户端的 window.localstorage.. 记住 locastorage 是客户端浏览器的东西.. 不是托管/服务器的东西.. 你的应用程序不知道它是否从任何地方提供服务
不适用于 localStorage。如果您只想将内容存储在您的域中,则需要一个后端来将数据保存到...使用 ember-data 等。
我没有时间进一步调查这个问题。我只是再次尝试并没有将 iframe 嵌入到从文件系统提供的 html 文件中。相反,我使用了从网络服务器提供的文件。神奇的是,现在一切正常(在 Chrome、Firefox、IE11 和 Safari 中测试)。也许我没有以正确的方式解释我的问题,但当我第一次尝试时,它似乎可以正常工作。
【参考方案1】:
在 Chrome 的设置 > 隐私 > 内容设置下,您将 cookie 设置设置为“阻止网站设置任何数据”
此复选框是导致异常的原因。
【讨论】:
如果不是默认的,大部分是不可用的,因为用户不会更改设置来使用某些网站。 这与“阻止网站设置任何数据”选项无关,而是:“阻止第三方 cookie 和网站数据”设置不会使大多数网站无法使用,但会切断大部分网站与您的搜索相关的广告 期望访问者为此调整设置似乎很不合理。而且我确信必须有更好的解决方案。我在尝试在网站上使用 Youtube API 时遇到了这个问题。 Youtube 在其他网站上运行良好,无需更改任何设置。必须有更好的解决方案,否则 Youtube 将无法在其他网站上运行。 我们在 iframe 中加载一个 react 应用程序,在 Mac + Chrome 中,出现此错误。我们不能告诉客户使用上述方法来修复错误。 javascript有什么办法吗? 当我注意到某些功能中断时,我正在使用隐身模式测试我的网站。似乎 Chrome 的隐身模式现在默认阻止localStorage
在 iframe 中使用(当您打开一个新的隐身页面时,“阻止第三方 cookie”有一个切换)。【参考方案2】:
According to this
在“内容设置”中设置“阻止第三方 Cookie 和站点数据”复选框时会引发此异常。 要找到该设置,请打开 Chrome 设置,在搜索框中输入“第三项”,单击“内容设置”按钮,然后查看 Cookies 下的第四项。
【讨论】:
【参考方案3】:在以下 URL 上:chrome://settings/content/cookies
取消选中“阻止第三方 cookie”。
【讨论】:
【参考方案4】:localStorage
是每个域,每个协议。如果您尝试从独立文件访问localStorage
,即使用file:///
协议,则本身没有域。因此,浏览器目前会抱怨您的文档无权访问localStorage
。如果您将文件放在 Web 服务器中(例如部署在 Tomcat 中)并从 localhost
访问它,您将能够访问 localStorage
。
【讨论】:
我自己我今天在网站内遇到了 iFrame 的问题..因此您的答案缺少某些内容:/ 仍在阅读有关它的内容,如果找到任何内容,我会告诉您。 如果我阅读了关于这个问题的评论,这完全有道理:如果网络应用程序使用本地存储,那么在 iframe 中运行它会导致跨域问题,因为 Window 是全局的......它将尝试访问本地客户端的 window.localstorage.. 记住 locastorage 是客户端浏览器的东西.. 不是托管/服务器的东西.. 你的应用程序不知道它是否从任何地方提供服务【参考方案5】:我在手机中遇到了这个问题,我无法使用 chrome 打开某个网站。 我花了一些时间在手机上找到 cookie,当我找到它时,我看到我的 cookie 被阻止了。
转到您的设置 --> 网站设置 --> Cookies
并允许网站保存和读取 cookie 数据,确保您不阻止第三方 cookie!
希望对你有帮助。
【讨论】:
【参考方案6】:正如 cmets 中所指出的,localstorage 只是单一来源——页面的来源。尝试从从不同来源加载的 iframe 访问页面的本地存储将导致错误。
您能做的最好的事情就是通过 postMessage API 使用 XDM 破解它。 This library 声称为你做繁重的工作,但我还没有尝试过。不过,我会确保你在走这条路之前知道IE's terrible support for XDM。
【讨论】:
正如我之前在评论中指出的那样,在我将 iframe 嵌入到由网络服务器而不是文件系统提供的文件中后,一切都按预期工作。所以一切正常。也许我只是错误地表达了我的问题。但感谢所有 cmets 和解释。如果有人对更多细节感兴趣,请问:) 我面临着类似的问题。你能告诉我你是怎么解决的吗? 同样的问题,考虑cookies..:/【参考方案7】:在 Chrome 中执行此操作的更安全的方法是只允许您信任的网站:
Chrome
-> "Settings"
-> "Show advanced settings..."
-> "Privacy"
-> "Content settings..."
-> "Manage exceptions..."
-> (add a pattern such as [*.]microsoft.com)
-> be sure to hit enter
-> "Done"
-> "Done"
【讨论】:
【参考方案8】:我检查了所有答案,但最终什么也没找到。然后我意识到我正在使用什么浏览器。如果您使用的是 Brave(基于 Chromium),如果您的盾牌已启动,您将收到此错误。试着降低你的盾牌。
【讨论】:
【参考方案9】:如果您使用隐身模式,请确保关闭"Block third-party cookies"
。
在任何隐身窗口中打开一个新选项卡,然后关闭该选项:
【讨论】:
【参考方案10】:恕我直言,这与您的 ember cli 应用程序上的 CSP 设置无关,而是与浏览器设置有关。 某些浏览器 (Chrome) 会阻止加载到 iframe 中的 localStorage 内容。 我们的 Ember 应用程序也面临着类似的情况,如果我们有一个 ember 应用程序和一个加载到 3rd 方网站上的插件,加载到 iframe 中的用户令牌在 Chrom 中被阻止,我们正在尝试一些解决方案,将保留这个帖子发布了它的进展情况。
【讨论】:
【参考方案11】:要消除此警告 - 在 Chrome 的设置 -> 隐私 -> 内容设置下,您必须清除“阻止第三方 cookie 和站点数据”选项
【讨论】:
【参考方案12】:在 Chrome 右上角执行此操作的安全方式,单击眼睛徽标并允许您所在的网站使用第三方 cookie:
Check this image if you can't find the eye logo
【讨论】:
【参考方案13】:如果禁用阻止第三方 cookie 不是一个选项,您可以使用 try...catch:
try
// SETUP SESSION, AUHT, LOCALE, SETTINGS ETC
catch(err)
// PROVIDE FEEDBACK TO THE USER
【讨论】:
以上是关于Chrome 中的 iframe 错误:无法从“窗口”读取“localStorage”:此文档的访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
国产银河麒麟系统上使用http弹窗下载时,chrome成功firefox无法弹窗的解决方案
Chrome 控制台中的沙盒权限错误,但我没有使用任何 iframe
iframe chrome:未捕获的 DOMException:无法从“Window”读取“localStorage”属性:此文档的访问被拒绝