MindSphere 内容安全策略
概述
本部分将介绍如何处理 MindSphere 中的内容安全策略 (CSP)。 内容安全策略是一种标准,用于防止跨站脚本攻击 (XSS)、恶意内容和代码执行攻击,或网站上下文中的点击劫持攻击。 通过将用户代理/浏览器加载的内容来源限制在站点操作员的允许来源列表中来防止此类攻击。
上述限制通过随服务器响应发送的消息头实现。在 MindSphere 平台中,内容安全策略消息头由 MindSphere 网关管理和发送。 内容安全策略通过 W3C 进行标准化。2 级版本以 W3C 建议提供,3 级版本以 W3C 工作草案提供。
为何使用内容安全策略?
CSP 有助于防止潜在攻击和各种跨站脚本漏洞。但是,您不能仅仅依赖 CSP,而是必须确保您的应用在多个级别上免受此类攻击。这里列举了几个 CSP 的常见场景:
- 通过禁用
eval
来防止直接动态代码评估。在某些情况下,eval
也有其用处。但是,我们始终建议您使用 Function 对象来创建动态执行代码(另请参见 OWASP 文章)。 - 防止某些可泄露敏感信息(如 CRSF 令牌)的图像来源(有关详细信息和示例,请参见 GitHub's post-CSP journey)。
- 限制浏览器仅从受信任的来源加载资源,并防止网页被嵌入到 iframe 中或完全阻止 iframe。
最后,我们建议您阅读 MDN 内容安全策略文档以查看可用配置的详细说明。 请阅读配置内容安全策略,了解如何为您的应用配置内容安全策略。
默认项与建议
我们建议您使用白名单方法,并使用非常严格的策略来替换默认策略。 因此,您必须为网站所使用的任何类型的内容和资源定义允许来源列表。 您也可以使用黑名单方法来防止您的网站遭到攻击。
在 MindSphere Developer Cockpit 中创建应用时,内容安全策略的默认消息头将设置为以下值:
Content-Security-Policy:default-src 'self' static.{env}.{mindsphere-domain}; style-src * 'unsafe-inline'; script-src 'self' 'unsafe-inline' static.{env}.{mindsphere-domain}; img-src * data:;
下表给出了各个配置项的详细说明,其中{env}
和{mindsphere-domain}
用于区域和域, 例如, eu1.mindsphere.io
:
指令 | 值 | 描述 |
---|---|---|
default-src | 'self' static.{env}.{mindsphere-domain} | 默认情况下,针对每个指令(如果没有被覆盖),我们仅允许从自有来源或{mindsphere-domain}的静态文件加载内容。 |
script-src | 'self' 'unsafe-inline' static.{env}.{mindsphere-domain} | 允许从相同来源或 MindSphere 静态文件加载脚本,并允许在 <script>...</script> 变量中执行脚本。我们建议使用更严格的配置。 |
style-src | * 'unsafe-inline' | 允许从所有来源和行内样式属性加载样式表。我们建议限制这些设置。 |
img-src | * data: | 允许从所有来源加载图像,并在样式表和变量中使用数据模式,例如:BASE64 编码图像。 |
此外,我们建议为其它内容类型定义规则:
指令 | 示例值 | 描述 |
---|---|---|
child-src | self | 定义加载帧的有效来源。建议使用该指令,而非过时的 frame-src 指令。 |
connect-src | self | 定义执行 AJAX、WebSocket 或 EvenSource 请求的有效来源。如需调用外部 API,需要对来源进行更改。 |
font-src | self | 定义字体的有效来源。 |
form-action | self | 定义可用作 <form>...</form> 动作的有效来源。 |
Web 框架和 Webpack
不建议使用 JavaScript eval()
,因为它用调用者的权限来执行传递的代码并且性能较低。 在某些情况下,恶意方可能最终会在用户的机器上运行可导致攻击的代码。 现代 JavaScript 引擎还支持创建不受安全性和性能问题影响的 Function 对象。
然而,angular 或 vue.js 等主流框架仍然使用 eval
,这主要归因于底层 web bundler webpack。 在编译/捆绑应用时, webpack 通常用于转译现代 JavaScript 或 TypeScript 以支持多个浏览器和浏览器版本。 转译后将发出所谓的源映射,其中包含已转译代码和原始代码之间的映射,以允许调试 web 应用。 webpack 提供了各种源映射的生成方式,而常用样式是 cheap-eval-source-map
。 这虽然适合本地开发,但会对生产环境构成问题,如上一节所述。
当前的默认策略强制您选择不同样式的源映射,以避免 MindSphere 平台上出现任何问题。 您可以在官方 webpack 文档中找到 devtool 配置的备选方案。 angular 等框架也会提供源映射样式的配置参数。
相关链接
还有问题?
除非另行声明,该网站内容遵循MindSphere开发许可协议.