内容安全策略时框架内的 mailto href 不起作用
mailto href inside frame not working when Content Security Policy
总结:
位于 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>
。单击 link 失败:Refused to frame '' because it violates the following Content Security Policy directive...
。 如何更改我的 CSP 值以防止出现此错误;在用户首选的电子邮件客户端中打开一封新电子邮件(mailto
的正常行为)? 我正在使用 Chrome1
详情:
与 这个问题“mailto link not working within a frame chrome (over https) 相似但不同
"
我认为我的不是重复的,因为:
我 无法 重现该错误,我在尝试时看到控制台 警告 关于 mixed-content重现他们的步骤:
Mixed Content: The page at 'https://localhost:3001/https_index.html' was loaded over HTTPS, but requested an insecure resource 'mailto:...'. This content should also be served over HTTPS.
我的步骤很具体;我的页面及其 iframe src 都是 https
,但页面本身带有特定的 限制性 Content-Security-Policy
(CSP
):
app.use(csp({
directives: {
defaultSrc: ["'self' 'unsafe-inline' https://localhost:3001/https_index.html"]
}
}));
也导致 error 我 can reproduce 是不同的:
Refused to frame '' because it violates the following Content Security Policy directive: "default-src 'self' https://localhost:3001/https_index.html". Note that 'frame-src' was not explicitly set, so 'default-src' is used as a fallback.
图片如下:
- 原始问题的 accepted answers 将 帮助我解决 我的 CSP 特定问题,也就是说,如果我将
target="_top"
添加到 link,电子邮件客户端打开时没有错误:
<a target="_top" href="mailto:...">email</a>
类似的修复适用于另一个 similar but different issue. 但是,这个 可能 1 有时会打开一个新选项卡
所以我的问题是关于 :
...Refused to frame '' because it violates the following Content Security Policy directive: ...
注意上面写着 frame ''
。该框架被识别为 空字符串 !
通常如果某些资源违反了 CSP,the URL of the resource is identified; i.e.
Refused to laod the script 'http://evil.com/evil.js'...
并且如果 CSP
-违反 URL 被识别+提供我可以使用它;将它添加到我的 CSP
值 default-src
:
`app.use(csp({
directives: {
defaultSrc: ["http://evil.com/evil.js 'self' 'unsafe-inline' https://localhost:3001/https_index.html"]
}
}));`
但是我可以允许 href
值例外吗?专门针对 mailto
?我试过像 mailto*
这样的通配符,但是:
The source list for Content Security Policy directive 'default-src' contains an invalid source: 'mailto*'.
而且我想知道是否有任何通配符仍然有效; Chrome 真的将 href="mailto..."
框架视为空字符串吗?我想是的,因为它本身不是 URL; Chrome "wants" 在 iframe 上下文中启动外部应用程序(即 Outlook);谁绑定到其父页面的 CSP 规则...
脚注:
- Chrome 在 CSP 或沙箱情况下显示上述错误。尽管
CSP
的值,Internet Explorer 不会抱怨 iframes
href。 Internet Explorer 也没有 "new tab" 问题,尽管 sandbox
的值。 IE 11.1914 只会给出消息:
使用 target="_top"
的修复可能会打开一个新选项卡,如果您 sandbox
编辑了您的 iframe! (sandbox
不同于 CSP
)。我不喜欢新标签。 Chrome 给我这个错误...
Unsafe JavaScript attempt to initiate navigation for frame with URL 'http://localhost:3000/' from frame with URL 'https://localhost:3001/index.html'. The frame attempting navigation of the top-level window is sandboxed, but the flag of 'allow-top-navigation' or 'allow-top-navigation-by-user-activation' is not set.
...但打开了一个新选项卡,以及 Outlook 电子邮件客户端...
我按照错误提示做了;修改 iframe
sandbox
属性的值:
sandbox="allow-top-navigation allow-same-origin ..."
和 mailto link 工作(和以前一样),但 没有 打开过多的新标签。太棒了!
遇到同样的问题后偶然发现了这个问题。经过数小时的搜索,关于此的文档令人惊讶地少。
我的第一直觉是像你一样做一些事情,mailto*
或 mailto:*
。
最终起作用的是省略通配符,并像这样更改 frame-src
指令:
frame-src 'self' mailto: tel: *.mydomain.com
tel:
iframe 中的链接也已损坏。
总结:
位于 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>
。单击 link 失败:Refused to frame '' because it violates the following Content Security Policy directive...
。 如何更改我的 CSP 值以防止出现此错误;在用户首选的电子邮件客户端中打开一封新电子邮件(mailto
的正常行为)? 我正在使用 Chrome1
详情:
与 这个问题“mailto link not working within a frame chrome (over https) 相似但不同 "
我认为我的不是重复的,因为:
我 无法 重现该错误,我在尝试时看到控制台 警告 关于 mixed-content重现他们的步骤:
Mixed Content: The page at 'https://localhost:3001/https_index.html' was loaded over HTTPS, but requested an insecure resource 'mailto:...'. This content should also be served over HTTPS.
我的步骤很具体;我的页面及其 iframe src 都是
https
,但页面本身带有特定的 限制性Content-Security-Policy
(CSP
):app.use(csp({ directives: { defaultSrc: ["'self' 'unsafe-inline' https://localhost:3001/https_index.html"] } }));
也导致 error 我 can reproduce 是不同的:
Refused to frame '' because it violates the following Content Security Policy directive: "default-src 'self' https://localhost:3001/https_index.html". Note that 'frame-src' was not explicitly set, so 'default-src' is used as a fallback.
图片如下:
- 原始问题的 accepted answers 将 帮助我解决 我的 CSP 特定问题,也就是说,如果我将
target="_top"
添加到 link,电子邮件客户端打开时没有错误:<a target="_top" href="mailto:...">email</a>
类似的修复适用于另一个 similar but different issue. 但是,这个 可能 1 有时会打开一个新选项卡
所以我的问题是关于
...Refused to frame '' because it violates the following Content Security Policy directive: ...
注意上面写着 frame ''
。该框架被识别为 空字符串 !
通常如果某些资源违反了 CSP,the URL of the resource is identified; i.e.
Refused to laod the script 'http://evil.com/evil.js'...
并且如果 CSP
-违反 URL 被识别+提供我可以使用它;将它添加到我的 CSP
值 default-src
:
`app.use(csp({
directives: {
defaultSrc: ["http://evil.com/evil.js 'self' 'unsafe-inline' https://localhost:3001/https_index.html"]
}
}));`
但是我可以允许 href
值例外吗?专门针对 mailto
?我试过像 mailto*
这样的通配符,但是:
The source list for Content Security Policy directive 'default-src' contains an invalid source: 'mailto*'.
而且我想知道是否有任何通配符仍然有效; Chrome 真的将 href="mailto..."
框架视为空字符串吗?我想是的,因为它本身不是 URL; Chrome "wants" 在 iframe 上下文中启动外部应用程序(即 Outlook);谁绑定到其父页面的 CSP 规则...
脚注:
- Chrome 在 CSP 或沙箱情况下显示上述错误。尽管
CSP
的值,Internet Explorer 不会抱怨iframes
href。 Internet Explorer 也没有 "new tab" 问题,尽管sandbox
的值。 IE 11.1914 只会给出消息:
使用
target="_top"
的修复可能会打开一个新选项卡,如果您sandbox
编辑了您的 iframe! (sandbox
不同于CSP
)。我不喜欢新标签。 Chrome 给我这个错误...Unsafe JavaScript attempt to initiate navigation for frame with URL 'http://localhost:3000/' from frame with URL 'https://localhost:3001/index.html'. The frame attempting navigation of the top-level window is sandboxed, but the flag of 'allow-top-navigation' or 'allow-top-navigation-by-user-activation' is not set.
...但打开了一个新选项卡,以及 Outlook 电子邮件客户端...
我按照错误提示做了;修改 iframe
sandbox
属性的值:
sandbox="allow-top-navigation allow-same-origin ..."
和 mailto link 工作(和以前一样),但 没有 打开过多的新标签。太棒了!
遇到同样的问题后偶然发现了这个问题。经过数小时的搜索,关于此的文档令人惊讶地少。
我的第一直觉是像你一样做一些事情,mailto*
或 mailto:*
。
最终起作用的是省略通配符,并像这样更改 frame-src
指令:
frame-src 'self' mailto: tel: *.mydomain.com
tel:
iframe 中的链接也已损坏。