首页 > 解决方案 > 需要帮助了解 CSP 报告并设置正确的框架祖先 url

问题描述

我正在尝试将我的 Web 应用程序作为 Office 加载项包含在内。该加载项包括我的应用程序使用 iframe,因此我需要调整我的应用程序的“内容安全策略”标头以使其正常工作。

当前标头的值为content-security-policy: frame-src 'self' ; frame-ancestors 'self'; object-src 'none';. 如果我将标题设置为content-security-policy: frame-src 'self' * ; frame-ancestors 'self' *; object-src 'none';一切正常,但我不想让每个人都使用 iframe 包含我的应用程序。

所以我试图限制使用类似的东西,content-security-policy: frame-src 'self' https://outlook.live.com; frame-ancestors 'self' https://outlook.live.com ; object-src 'none';但这不起作用。Chrome 的 JS 控制台说:拒绝构建“https://auth-recette-broc.kinexo.fr/”,因为祖先违反了以下内容安全策略指令:“frame-ancestors 'self' https://outlook.live。 com”。

而“csp 报告”是:

{
  "document-uri": "https://auth-mywebsite.xx/",
  "referrer": "https://yy-mywebsite.xx/",
  "violated-directive": "frame-ancestors",
  "effective-directive": "frame-ancestors",
  "original-policy": "frame-src 'self'  https://outlook.live.com; frame-ancestors 'self' https://outlook.live.com ; object-src 'none';",
  "disposition": "report",
  "blocked-uri": "https://auth-mywebsite.xx/",
  "status-code": 0,
  "script-sample": ""
}

我不明白这个 csp 报告

  1. 为什么父框架 URI ( https://outlook.live.com ) 的 url 不显示为document-uri
  2. document-uri当和blocked-uri属性相同并self允许框架时,为什么框架被拒绝?
  3. 如何知道预期的 url 作为框架祖先以允许框架?

标签: securityiframeoutlookhttp-headerscontent-security-policy

解决方案


为什么父框架 URI ( https://outlook.live.com ) 的 url 不显示为 document-uri?

frame-ancestors指令是特殊的——它作用于父页面,而其他指令作用于页面本身(它发布了 CSP)。
因此,在frame-ancestors违反的情况下,它是框架本身document-uri的 Url (它发布 CSP)。

为什么当 document-uri 和 blocked-uri 属性相同并且允许 self 框架时,框架会被拒绝?

blocked-uri如果frame-ancestors是浏览器依赖:

  • Chrome 显示为blocked-uri锁定容器(iframe)本身的 URI。
  • Firefoxblocked-uri从顶层窗口获取(但对于嵌套级别 >1 Firefox 有一个错误并发送一个空的blocked-uri)。

因此,在 Chromeblocked-uri中将等于document-uri.

据我了解,您有一个https://yy-mywebsite.xx嵌入https://auth-mywebsite.xx/.
https://auth-mywebsite.xx/页面发布一个 CSPframe-ancestors 'self'; object-src 'none';
在这种情况下'self'意味着不允许https://auth-mywebsite.xx/嵌入。https://yy-mywebsite.xx你必须至少有frame-ancestors 'self' https://yy-mywebsite.xx; object-src 'none';

如何知道预期的 url 作为框架祖先以允许框架?

frame-ancestors指令检查所有祖先(父母的整个上游链),而不仅仅是最近的父母。因此,您必须指定允许嵌入 iframe 的所有主机。


推荐阅读