语境
我在页面上有这个 CSP(在 vite react 应用程序中):
frame-src http://localhost:3080; style-src 'self' 'unsafe-inline' http://localhost:3080
页面上http://localhost:3080
嵌入了一个 iframe。我无法控制该 iframe,因为它是由本地容器中运行的第三方应用生成的。iframe 自己的 CSP 标头类似于以下内容:
default-src 'none'; script-src 'self' https://maps.google.com https://accounts.google.com https://www.google-analytics.com 'sha256-xxxx=' 'sha256-xxxx=' 'sha256-xxxx='; child-src 'self' https://accounts.google.com; style-src 'self' 'nonce-xxxx' https://accounts.google.com; font-src *; img-src * 'self' data:; connect-src 'self' https://accounts.google.com service.us10.list-manage.com www.google-analytics.com https://service.example.com ; manifest-src 'self'; frame-ancestors 'none';
问题
在主 vite 应用程序中,当我尝试调整子 iframe 的高度时,浏览器中出现此错误:
Uncaught SecurityError: Failed to read a named property 'document' from 'Window': Blocked a frame with origin "http://localhost:3000" from accessing a cross-origin frame.
还有这个错误(这很有趣,因为我没有直接对https://accounts.google.com做任何事情):
Refused to apply inline style because it violates the following Content Security Policy directive: "style-src 'self' 'nonce-xxxx' https://accounts.google.com". Either the 'unsafe-inline' keyword, a hash ('sha256-xxxx='), or a nonce ('nonce-...') is required to enable inline execution.
问题
在上述情况下,vite 应用程序是否可以实现 CSP,从而允许更新 iframe 的高度,或者这是不可能的?我无法判断代码是否错误,或者这在技术上是否不可行。
如果您在与主应用程序不同的端口上运行第三方应用程序,那么您将受到跨域浏览器限制。
简单的解决方案是在您的应用程序和第三方应用程序和服务器前面放置一个反向代理(Nginex),它们都来自同一个域、端口和协议。