摘要:
https://localhost:3000
的网站Content-Security-Policy
值default-src 'self' 'unsafe-inline' https://localhost:3001/https_index.html
包含指向https://localhost:3001/index.html
的iframe。 :3001/index.html
的内容包含<a href="mailto..."></a>
。单击该链接失败:Refused to frame '' because it violates the following Content Security Policy directive...
。 如何更改CSP值以防止此错误;在用户首选的电子邮件客户端中打开新电子邮件(mailto
的正常行为)?我正在使用Chrome 1
详细:
类似但不同于this question "mailto link not working within a frame chrome (over https) "
我认为我的不是重复因为:
我无法重现该错误,当我尝试重现他们的步骤时,我看到关于mixed-content的控制台警告:
混合内容:“https://localhost:3001/https_index.html”的页面是通过HTTPS加载的,但是请求了一个不安全的资源“mailto:...”。此内容也应通过HTTPS提供。
我的步骤是具体的;我的页面和它的iframe src是https
,但页面本身是通过特定的限制性 Content-Security-Policy
(CSP
)提供的:
app.use(csp({
directives: {
defaultSrc: ["'self' 'unsafe-inline' https://localhost:3001/https_index.html"]
}
}));
此外,错误我 可以重现:
拒绝框架'',因为它违反了以下内容安全政策指令:“default-src'self'https://localhost:3001/https_index.html”。请注意,'frame-src'未明确设置,因此'default-src'用作后备。
target="_top"
到该链接,电子邮件客户端打开没有错误:
<a target="_top" href="mailto:...">email</a>
类似的修复适用于另一个similar but different issue.但是,此可能 1 有时会打开一个新标签所以我的问题是关于Content-Security-Policy
error (see above):
...拒绝框架'',因为它违反了以下内容安全政策指令:...
请注意frame ''
。该框架被标识为空字符串!
通常,如果某些资源违反了CSP,the URL of the resource is identified; i.e.
拒绝提交脚本'http://evil.com/evil.js'......
如果识别出CSP
- 违反网址+提供,我可以使用它;将其添加到CSP
的{{1}}值:
default-src
但是我可以允许`app.use(csp({
directives: {
defaultSrc: ["http://evil.com/evil.js 'self' 'unsafe-inline' https://localhost:3001/https_index.html"]
}
}));`
值的例外吗?专门针对href
?我尝试过像mailto
这样的通配符,但是:
内容安全策略指令'default-src'的源列表包含无效的源:'mailto *'。
我想知道是否有任何通配符无论如何都会起作用; Chrome真的认为mailto*
框架是空字符串吗?我想是的,因为它本身不是URL; Chrome“希望”在iframe的上下文中启动外部应用程序(即Outlook);谁被绑定到其父页面的CSP规则......
脚注:
href="mailto..."
的值为iframes
,但Internet Explorer不会抱怨CSP
href。尽管sandbox
的值很高,但Internet Explorer也没有“新标签”问题。 IE 11.1914将只提供消息:如果您target="_top"
编辑了iframe,则使用sandbox
的修复可能会打开新标签! (sandbox
与CSP
不同)。我不喜欢新标签。 Chrome给了我这个错误......
不安全的JavaScript尝试从包含网址“http://localhost:3000/”的框架启动包含网址“https://localhost:3001/index.html”的框架的导航。尝试导航顶层窗口的框架是沙盒,但未设置“允许顶部导航”或“允许顶部导航 - 按用户激活”标记。
...但是打开了一个新标签页以及Outlook电子邮件客户端...
我做了错误建议的内容;修改iframe
sandbox
属性的值:
sandbox="allow-top-navigation allow-same-origin ..."
,mailto链接工作(如前所述),但不打开一个过多的新标签。太好了!
答案 0 :(得分:3)
遇到相同问题后偶然发现了这个问题。经过数小时的搜索,几乎没有关于此的文档。
我的第一个直觉是做mailto*
或mailto:*
这样的事情。
最终工作的是省略通配符,并像这样更改frame-src
指令:
frame-src 'self' mailto: tel: *.mydomain.com
tel:
链接在iframe中也被破坏。