安全错误:该操作存在风险 - window.history.pushState()

77
我在 Firefox 控制台中遇到了这个错误:SecurityError: The operation is insecure,其中 HTML5 功能 window.history.pushState() 被认为是罪魁祸首,在尝试使用 AJAX 加载数据时发生。它应该加载一些数据,但 JavaScript 在出现错误时停止执行。
我想知道为什么会发生这种情况。这是某种服务器配置错误吗?任何帮助都将不胜感激。
更新:是由于域名不匹配导致的服务器错误:http://en.wikipedia.org/wiki/Same-origin_policy

9
您正在访问 file:/// URL 吗? - robertc
@robertc 你是什么意思?它一直都是 http://。我怀疑这可能是因为使用了子域名,但 pushState 尝试推送的只是 /,所以不应该有任何影响。 - Atadj
11个回答

50

确保您遵循同源策略。这意味着相同的域名,子域名,协议(http vs https)和端口。

pushState如何防止潜在的内容伪造?

编辑:正如@robertc在他的评论中所指出的,当起源是file:///时,一些浏览器实际上会实现稍微不同的安全策略。更不用说当页面期望从不同的起源运行时(因此您的pushState 假定生产起源方案,而不是本地主机方案)在测试本地文件时可能会遇到问题。


10
如何在file:///中使用pushState - Sashko Lykhenko
@SashkoLykhenko 你不需要这么做。一般来说,浏览器对于 file:// URI 应用更严格的安全限制。即使所引用的文件在同一系统上,浏览器也会将 file:// URI 视为来自唯一的源。因此,任何需要跨源检查的操作都会在与 file:// URI 结合使用时失败。 - Ouroborus

15

我们在用户在访问我们的网站之前禁用了他们的Cookie时遇到了“SecurityError: The operation is insecure”的错误,任何随后尝试使用会话的XHR请求显然都会失败并引起此错误。


1
当用户禁用了他们的cookies时,你可以将XHR请求代码包裹在try / catch块中,并使用catch来提示用户启用cookies。包装window.localStoragewindow.history.pushState()或任何XHR请求。 - jeremysmith

5

您应该尽量不要使用文件夹浏览器方法(即file://),而是从http://打开该文件(即从http://localhost/http://yoursite.com/中打开)


5

在我的情况下,我在推送的url中缺少了'www.'。它必须是精确匹配的,如果你正在处理www.test.com,你必须推送到www.test.com而不是test.com


4

我在使用ReactJS的history push时遇到了问题,后来发现我试图打开一个带有双斜杠//link的链接。


2
当我从一个文件中调用另一个 JavaScript 文件时,没有将 JavaScript 的“物理”地址放入其中,我遇到了同样的问题。 我通过从 HTML 中以相同的方式调用它来解决这个问题,例如:“JS / archivo.js”而不是“archivo.js”。

2
创建PWA时,在非https服务器上使用的服务工作者也会生成此错误。

1
将index.js文件中的serviceWorker.unregister()替换为serviceWorker.register()。

1

我曾经遇到过同样的问题,原因是将<base href=>设置为裸域名,而我的服务器始终服务于www域名。在base href中添加www到URL中解决了这个问题。


1

我通过从file协议切换到http协议来解决了这个问题。

  • 您可以在VS Code中使用"live-server"扩展,
  • 或者,在node上使用live-server [dirPath]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接