我有一个iframe
的网页,其中包含一个指向具有target="_blank" rel="noopener"
属性的外国页面的链接。此链接在页面本身和iframe
上都可以正常工作,但仅在通过上下文菜单使用open in new tab
选项调用时有效。常规单击会打开一个新选项卡,并显示正确的URL
,但结果是This page has been blocked by Opera ERR_BLOCKED_BY_CLIENT
。
我环顾四周寻求帮助,禁用所有插件无济于事,并发挥在隐姓埋名模式的情况下,以及,没有变化。错误页面上的控制台显示VM589:1460 crbug/1173575, non-JS module files deprecated.
这个提示让我蒙在鼓里。我将属性操作为target="_blank" rel="noopener" rel="noreferrer"
或rel="noopener noreferrer"
,但没有成功。这一切都适用于Opera
。
我尝试了Brave
,结果和错误消息相同,当然,除了Brave
而不是Opera
。Edge
加入故障带。毫不奇怪,然后看到This page has been blocked by Chrome
正确的。
此错误适用于所有来自iframe
的PDF
文件链接,正常的外部链接工作正常。Firefox
在新选项卡中短暂显示PDF.js viewer
,然后正常工作。我没有机会尝试到YouTube
或类似的链接,但我想有充分的证据表明我遇到了chrome
PDF
渲染引擎中的一个bug。
该怎么做?谁对这个bug感兴趣,如何联系他们?或者我可以在代码中做些什么?
2条答案
按热度按时间nbewdwxp1#
浏览器使用**内容安全策略(CSP)**来保护用户免受不需要的内容的影响已经很长时间了。不需要的内容的定义可以由网站所有者进行。如果站点所有者没有这样做,则使用一些标准值,这些标准值更具限制性。
网站https://content-security-policy.com/这样解释
什么是内容安全策略?Content-Security-Policy是现代浏览器用于增强文档(或网页)安全性的HTTP响应标头的名称。Content-Security-Policy头允许您限制资源(如JavaScript,CSS或浏览器加载的几乎任何内容)的方式。
虽然它主要用作HTTP响应头,但您也可以通过 meta标记应用它。
术语内容安全策略通常缩写为CSP。
Content-Security-Policy有助于缓解哪些类型的攻击?CSP最初被设计用于减少跨站脚本(XSS)攻击的攻击面,该规范的后续版本还可以防止其他形式的攻击,如点击劫持。
在您的情况下,您必须为用户配置两个障碍:
基本上,允许大多数带有“self”的元素是相对安全的,但禁止在网站上根本不使用的元素总是好的。
您的内容安全策略应该与此类似,并且应该允许iframe中的PDF:
最好是在服务器配置中配置CSP。这不是每个网站所有者都能做到的,也可以在 meta标记中配置CSP。您可以将此添加到您的网站的head-tag内:
在服务器配置中设置CSP是更强的方法:
https://content-security-policy.com/examples/meta/
以下是更多示例,包括Apache Web Server和Nginx Webserver的CSP相关服务器配置:
https://content-security-policy.com/examples/
编辑
如果PDF托管在另一个域上,那么CSP必须进行不同的调整,更开放。此处解释了源的不同选项:
https://content-security-policy.com/#source_list
1.必须调整iframe,required规则。它应该被限制在一个特殊的域
*.example.com
或一个nonce与'nonce-rAnd 0 m'。因此,即使PDF是外部的,这并不意味着一切都可以以某种方式注入网站。
假设您将该选项用于域
*.example.com
,则它看起来像或类似于以下内容:假设你使用随机数的选项,它看起来像或类似于这样:
我没有测试它,所以可能需要轻微的调整。
mutmk8jj2#
我在我的网站和Nginx服务器块中设置了超级宽松的内容安全策略,嵌入式PDF仍然被阻止-但仅在某些计算机上。
事实证明,Google Workspace管理的浏览器默认设置为阻止iframe导航。设置在这里,以防它帮助某人:
1.登录https://admin.google.com/
1.导航到设备>Chrome>设置>用户和浏览器
1.在“内容”部分中,查找“iframe navigation”并将其设置为“Allow navigation to external protocols inside a sandboxed iframe”