内容安全策略框架祖先错误地阻止safari从文件系统



我正在为android开发一个cordova应用程序&当我注意到我的应用程序中使用的iframe在ios上不能正确加载时。事实证明,尽管从web服务器正确设置了帧祖先HTTP头,但如果通过文件系统打开,safari将错误地拒绝加载iframe。

Refused to load http://to-delete-test.azurewebsites.net/ because it does not appear in the frame-ancestors directive of the Content Security Policy.

测试页的CSP标头是:

Content-Security-Policy: frame-ancestors * data: blob: filesystem: about: ws: wss:

显示此错误的示例HTML文件(必须从文件系统加载):

<!DOCTYPE html>
<html lang="en">
<head>
<style>
* {
margin: 0; padding: 0; box-sizing: border-box;
}
iframe {
height: 100vh; width: 100%;
}
</style>
</head>
<body>
<iframe src="http://to-delete-test.azurewebsites.net"></iframe>
</body>
</html>

是否有一种方法,我可以修改页面标题,以允许通过iframe加载我的网站?

在注释中添加了其他信息后,情况变得清楚了。由于安全原因,像file:///path/to/file/index.html这样的文件:- url被禁止在嵌套的浏览上下文(iframe, object, embed)中打开,而不管CSP。<a href='file:///path/to/file/index.html'>也被禁止导航。

您无法通过使用CSP绕过此限制。此外,frame-ancestors指令不支持非网络方案,因为它失去了它的意义。

看起来也像控制台消息显示属于Safari,它有一点误导。Chrome应该显示真正的违规原因,如:拒绝加载iframefile:///path/to/file/index.html因为它违反了以下内容安全策略指令:….

。Chrome浏览器允许在加载图像/样式/脚本等的情况下使用file:///方案访问本地文件系统:

<img src='file:///c:/img.png'>
<script src='file:///c:/scripr.js'></script>
<link rel='stylesheet' href='file:///c:/style.css'>

,甚至支持CSP中的file:方案。
但是AFAIK浏览器扩展不应该通过file:///-URLs使用直接访问。扩展必须使用自己的打包资源或File API

相关内容

  • 没有找到相关文章