security - 需要帮助了解 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 报告
- 为什么父框架 URI ( https://outlook.live.com ) 的 url 不显示为
document-uri
? document-uri
当和blocked-uri
属性相同并self
允许框架时,为什么框架被拒绝?- 如何知道预期的 url 作为框架祖先以允许框架?
解决方案
为什么父框架 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。 - Firefox
blocked-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 的所有主机。