内容安全策略时框架内的 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) 相似但不同 "

我认为我的不是重复的,因为:

  1. 无法 重现该错误,我在尝试时看到控制台 警告 关于 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.

  2. 我的步骤很具体;我的页面及其 iframe src 都是 https,但页面本身带有特定的 限制性 Content-Security-Policy (CSP):

    app.use(csp({ directives: { defaultSrc: ["'self' 'unsafe-inline' https://localhost:3001/https_index.html"] } }));

  3. 也导致 errorcan 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.

图片如下:

  1. 原始问题的 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 被识别+提供我可以使用它;将它添加到我的 CSPdefault-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 规则...

脚注:

  1. Chrome 在 CSP 或沙箱情况下显示上述错误。尽管 CSP 的值,Internet Explorer 不会抱怨 iframes href。 Internet Explorer 也没有 "new tab" 问题,尽管 sandbox 的值。 IE 11.1914 只会给出消息:

  1. 使用 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 中的链接也已损坏。