1. Content security policies 内容安全策略
内容安全策略 (CSP) 是一种强大的工具,可用于缓解跨站脚本 (XSS) 和相关攻击,包括卡片浏览器、会话劫持、点击劫持等。 Web 服务器将 CSP 作为响应 HTTP 标头(即 Content-Security-Policy 和 Content-Security-Policy-Report-Only)发送到将脚本、样式和其他资源的来源列入白名单的浏览器。 CSP 和内置浏览器功能一起有助于防止:
- 从攻击者的网站加载恶意脚本
- 将信用卡信息发送到攻击者网站的恶意内联脚本
- 加载恶意样式,使用户点击不应该出现在页面上的元素
2. Application support 应用支持
从 2.3.5 版开始,Adobe Commerce 和 Magento Open Source 支持 CSP 标头并提供配置它们的方法。 (此功能在 Magento_Csp 模块中定义。)该应用程序还提供应用程序级别的默认配置以及需要额外配置的单个核心模块。可以分别为 adminhtml 和店面区域配置策略,以适应不同的用例。该应用程序还允许为特定页面配置唯一的 CSP。
CSP 可以在两种模式下工作:
- report-only :仅报告 – 在此模式下,应用程序报告策略违规但不干预。这种模式对于调试很有用。默认情况下,CSP 违规会写入浏览器控制台,但可以将它们配置为以 HTTP 请求的形式向端点报告以收集日志。有许多服务可以为您收集、存储和分类商店的 CSP 违规报告。
- restrict mode: 限制模式 – 在此模式下,应用程序对任何违反策略的行为采取行动。
3. Default configuration 默认配置
默认情况下,CSP 配置为仅报告模式,允许商家和开发人员配置策略以根据他们的自定义代码工作。配置策略后,将模式切换为限制。
配置后,应用程序可以强制执行以下策略:
- 任何资源,例如 .js、.css、.jpg 或 .ttf 文件,都只能从商店的域中加载
- iframe 只能包含商店本身的页面
- AJAX 请求只能发送到商店
- 表格只能发送到商店
- 浏览器只能编译列入白名单的内联脚本和样式
4. Configure a module’s CSP mode 配置模块的 CSP 模式
您可以通过编辑模块的 etc/config.xml 文件在自定义模块中设置 CSP 模式。要将模式设置为限制,请将 default/csp/mode/admin/report_only 和/或 default/csp/mode/storefront/report_only 元素的值更改为 0。要启用仅报告模式,请将值设置为 1 .
示例 config.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
<csp>
<mode>
<storefront>
<report_only>0</report_only>
</storefront>
<admin>
<report_only>0</report_only>
</admin>
</mode>
</csp>
</default>
</config>
您可以使用 Magento_Csp 模块中的 etc/config.xml 文件作为参考。创建你的组件文件结构描述了如何创建一个模块。
5. Configure CSPs for your custom code/extension/theme
为您的自定义代码/扩展/主题配置 CSP
Adobe Commerce 和 Magento Open Source 提供了多种方法来将列入白名单的资源添加到您的自定义代码、扩展程序或主题中。确保仅在需要它的模块中添加资源。例如,当您只需要从中加载 .js 文件时,不建议将域添加到 default-src 策略。而是将域添加到 script-src。
下表描述了每种类型的 CSP:
POLICY NAME:保单名称 | DESCRIPTION:描述 |
default-src:默认源 | The default policy :默认策略 |
base-uri :基础uri | Defines which URLs can appear in a page’s <base> element. 定义哪些 URL 可以出现在页面的 <base> 元素中。 |
child-src:子源 | Defines the sources for workers and embedded frame contents. 定义工作人员和嵌入框架内容的来源。 |
connect-src 连接源 | Defines the sources that can be loaded using script interfaces. 定义可以使用脚本接口加载的源。 |
font-src 字体源 | Defines which sources can serve fonts. 定义哪些源可以提供字体。 |
form-action 表单动作 | Defines valid endpoints for submission from <form> tags.定义从 <form> 标签提交的有效端点。 |
frame-ancestors框架祖先 | Defines the sources that can embed the current page. 定义可以嵌入当前页面的来源。 |
frame-src帧源 | efines the sources for elements such as <frame> and <iframe> .定义元素的来源,例如 <frame> 和 <iframe>。 |
img-src | Defines the sources from which images can be loaded. 定义可以从中加载图像的源。 |
manifest-src | Defines the allowable contents of web app manifests. 定义 Web 应用清单的允许内容。 |
media-src媒体源 | Defines the sources from which images can be loaded. 定义可以从中加载图像的源。 |
object-src对象源 | object-src对象源 |
script-src脚本源 | Defines the sources for JavaScript <script> elements.定义 JavaScript <script> 元素的来源。 |
style-src样式-src | Defines the sources for stylesheets. 定义样式表的来源。 |
5.1 Add a domain to the whitelist 将域添加到白名单
您可以通过将 csp_whitelist.xml 添加到自定义模块的 etc 文件夹中,将域添加到策略的白名单(如 script-src、style-src、font-src 等)。
<?xml version="1.0"?>
<csp_whitelist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Csp:etc/csp_whitelist.xsd">
<policies>
<policy id="script-src">
<values>
<value id="devdocs-base" type="host">https://developer.adobe.com</value>
<value id="magento" type="host">https://magento.com</value>
</values>
</policy>
<policy id="connect-src">
<values>
<value id="devdocs" type="host">https://developer.adobe.com</value>
</values>
</policy>
</policies>
</csp_whitelist>
5.2 Whitelist an inline script or style 将内联脚本或样式列入白名单
对于 style-src 和 script-src(Adobe Commerce 和 Magento Open Source 2.4 的默认设置)内联脚本和样式禁用了 unsafe-inline 的商店必须列入白名单。
5.3 Advanced CSP configuration 高级 CSP 配置
本文参考: https://developer.adobe.com/commerce/php/development/security/content-security-policies/