http2 - 阻止来自允许 URL 的脚本
问题描述
一、总结
我没有找到我在 Content-Security-Policy 中允许的如何阻止来自 URL 的脚本。
2. 限制
我有一个静态网站。如果 JavaScript 的任何解决方案包括 JQuery 和/或任何其他库,那就太好了;但不是动态站点的解决方案。
3. 目标
我在我的网站中包含第三方框架、视频、小部件等,其中可能包含分析脚本。我不希望我网站的访问者被跟踪。我想阻止请求。
我网站的访问者可以安装一些浏览器扩展程序,以防止在线跟踪。但没有浏览器扩展的用户将被跟踪。
如果网站访问者没有任何阻止工具,我无法找到如何阻止在我的网站上进行在线跟踪。
更多细节在这里。
4. 例子
我将 Streamable 视频添加到 HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https://streamable.com">
</head>
<body>
<div style="width:100%;height:0px;position:relative;padding-bottom:100.000%;"><iframe src="https://streamable.com/s/aqg9y/uknjqm" frameborder="0" width="100%" height="100%" allowfullscreen style="width:100%;height:100%;position:absolute;left:0px;top:0px;overflow:hidden;"></iframe></div>
</body>
</html>
5. 重现步骤
我禁用了 Firefox 演示页面中的所有广告和跟踪拦截器 → 我打开了 Firefox 本地控制台。
6. 预期行为
- 块:https ://secure.quantserve.com/quant.js和 https://www.google-analytics.com/analytics.js — 分析脚本
- 允许:任何其他 Streamable 脚本
7.实际行为
允许:所有 Streamable 脚本包括https://secure.quantserve.com/quant.js 和 https://www.google-analytics.com/analytics.js
8. 没有帮助
解决方案
iframe 加载完全独立的文档,如果允许加载,则不受该顶级页面的 CSP 约束。
因此,您拥有实现 CSP 的顶级页面。然后它在 iframe 中加载另一个页面。该页面允许作为顶级页面的 iframe 加载,因为顶级 CSP 允许加载该域。
然后,iframed 页面将完全单独加载。它没有 CSP,因此可以免费加载任何内容 - 包括该页面上引用的分析。
您可以使用 iframe 的 sandbox 属性获得一些您想要的东西- 但是它有一些限制:例如,不允许某些脚本而不是其他脚本是不可能的。并且可以使用图像进行跟踪。
另一种选择是通过您的服务器代理第 3 方内容,然后将 CSP 注入该 iframed 页面,然后让您的顶级页面加载该更改后的页面。例如:
<iframe src="https://example.com?pagetoload=streamable.com/s/aqg9y/uknjqm" frameborder="0" width="100%" height="100%" allowfullscreen></iframe>
通过 HTTP 标头而不是元标记应用 CSP 也会更容易,因此您甚至不需要更改可流式页面返回的 HTML。
请注意,拥有一个完全开放的代理,可以加载任何页面可能会导致许多其他安全问题,包括但不限于:
- 该页面现在存在于该域中,就该浏览器而言,因此可以访问该域的 cookie。
- 我可以显示https://example.com?pagetoload=evil.example.com并避免任何可能阻止 evil.example.com 的浏览器安全性。
以及许多其他类似的问题...
推荐阅读
- java - 如何在不丢失 jlabel 中的增量值的情况下从一个 jframe 跳转到另一个
- java - 使用 Firebase 查询获取 NullPointerException 和应用程序崩溃
- azure - 登录到 Azure Sql
- c - 如何与 SoftFloat 库链接?
- spring-boot - 使用spring-boot在多个数据库之间进行数据迁移
- react-native - react-native 数字类型更改 returnKeyType
- spring - 使用 JdbcTemplate 的单个实例
- javascript - 注入到 body 元素的全浏览器屏幕 DIV
- android-fragments - Kotline:Recyclerview 和 Fragment 错误 E/RecyclerView:未连接适配器;跳过布局
- typescript - 来自打字稿的摩卡测试调试问题