内容安全策略

时间:2017-12-19 00:41:20

标签: iframe href mailto content-security-policy

摘要

https://localhost:3000的网站Content-Security-Policydefault-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) "

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

  1. 无法重现该错误,当我尝试重现他们的步骤时,我看到关于mixed-content的控制台警告

      

    混合内容:“https://localhost:3001/https_index.html”的页面是通过HTTPS加载的,但是请求了一个不安全的资源“mailto:...”。此内容也应通过HTTPS提供。

  2. 我的步骤是具体的;我的页面和它的iframe src是https,但页面本身是通过特定的限制性 Content-Security-PolicyCSP)提供的:

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

  3. 此外,错误 可以重现:

      

    拒绝框架'',因为它违反了以下内容安全政策指令:“default-src'self'https://localhost:3001/https_index.html”。请注意,'frame-src'未明确设置,因此'default-src'用作后备。

  4. 使用如下图像: showing Google Chrome sad-face icon suggesting error; the message says 'Requests to the server have been blocked by an extension'

    1. 原始问题accepted answers帮助我解决我的CSP 特定问题,也就是说,如果我添加target="_top"到该链接,电子邮件客户端打开没有错误: <a target="_top" href="mailto:...">email</a> 类似的修复适用于另一个similar but different issue.但是,此可能 1 有时会打开一个新标签
    2. 所以我的问题是关于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规则......

      脚注:

      1. Chrome会在CSP或沙箱中显示上述错误。尽管href="mailto..."的值为iframes,但Internet Explorer不会抱怨CSP href。尽管sandbox的值很高,但Internet Explorer也没有“新标签”问题。 IE 11.1914将只提供消息:
      2. Internet Explorer dialog asking user to confirm they want to allow this page to open Outlook to a source of href, and choose to ignore this message in future

        1. 如果您target="_top"编辑了iframe,则使用sandbox 的修复可能会打开新标签! (sandboxCSP不同)。我不喜欢新标签。 Chrome给了我这个错误......

            

          不安全的JavaScript尝试从包含网址“http://localhost:3000/”的框架启动包含网址“https://localhost:3001/index.html”的框架的导航。尝试导航顶层窗口的框架是沙盒,但未设置“允许顶部导航”或“允许顶部导航 - 按用户激活”标记。

        2. ...但是打开了一个新标签页以及Outlook电子邮件客户端...

          showing a new tab opened in Chrome browser, whose URL is set to the "mailto:" value from within the iframe

          我做了错误建议的内容;修改iframe sandbox属性的值: sandbox="allow-top-navigation allow-same-origin ...",mailto链接工作(如前所述),但打开一个过多的新标签。太好了!

1 个答案:

答案 0 :(得分:3)

遇到相同问题后偶然发现了这个问题。经过数小时的搜索,几乎没有关于此的文档。

我的第一个直觉是做mailto*mailto:*这样的事情。

最终工作的是省略通配符,并像这样更改frame-src指令:

frame-src 'self' mailto: tel: *.mydomain.com

tel:链接在iframe中也被破坏。