订单创建页面疑难解答 CSP 受限模式
本文为在管理员端使用创建订单时出现Adobe Commerce 2.4.7问题提供了说明和修复 CSP restricted mode 是 已启用,带有"拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …“浏览器控制台日志中显示错误消息。
受影响的产品和版本
云基础架构上的Adobe Commerce、Adobe Commerce内部部署和Magento Open Source:
- 2.4.7
- 2.4.6像素
- 2.4.5-pX
- 2.4.4像素
问题 — 管理员 创建订单 页面已损坏或无法加载
管理员 创建订单 页面已损坏或无法加载,使用"拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …“浏览器控制台日志中显示错误消息。
重现问题的步骤:
- 转到 Sales > Orders.
- 创建新订单。
预期结果:
管理员 创建订单 页面会正常完全加载。
实际结果:
管理员 创建订单 页面为空或缺少组件。 以下各项 JS 错误显示在浏览器控制台日志中:“拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …"
原因
在Adobe Commerce和Magento Open Source版本2.4.7及更高版本中, CSP 在中配置 restrict-mode
,默认情况下,适用于店面和管理区域以及中的付款页面 report-only
模式。
对应的 CSP 标题不包含 unsafe-inline
中的关键词 script-src
付款页的指令。 此外,仅限 whitelisted 允许使用内联脚本。
解决方案
由于某些脚本被阻止,用户可能会看到浏览器错误 CSP:
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src
要解决此问题,您必须:
-
Whitelist 阻止的脚本使用
SecureHtmlRenderer
类。 -
使用
CSPNonceProvider
类以允许执行脚本。
Adobe Commerce和Magento Open Source2.4.7及更高版本包括 Content Security Policy (CSP) nonce 提供商,以便于生成唯一的 nonce 每个请求的字符串。 这些 nonce 字符串随后将附加到 CSP 标题。使用
generateNonce
函数位于Magento\Csp\Helper\CspNonceProvider
以获取 nonce 字符串。code language-php use Magento\Csp\Helper\CspNonceProvider; class MyClass { /** * @var CspNonceProvider */ private $cspNonceProvider; /** * @param CspNonceProvider $cspNonceProvider */ public function __construct(CspNonceProvider $cspNonceProvider) { $this->cspNonceProvider = $cspNonceProvider } /** * Get CSP Nonce * * @return String */ public function getNonce(): string { return $this->cspNonceProvider->generateNonce(); } }
-
添加 hash 至模块的
csp_whitelist.xml
文件。
问题 — 付款方法缺失或无法正常工作
管理员缺少付款方法或无法使用该方法 订单创建页面,带有"拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …“浏览器控制台日志中显示错误消息。
重现问题的步骤:
- 转到 Sales > Orders.
- 创建新订单。
- 创建新客户。
- 输入客户详细信息。
- 输入订单详细信息(产品、发运方法)。
- 选择付款方式。
预期结果:
您可以选择付款方式并继续成功下单。
实际结果:
付款方式缺失或无法正常工作。 以下各项 JS 错误显示在浏览器控制台日志中:“拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …“。
原因
在Adobe Commerce和Magento Open Source版本2.4.7及更高版本中, CSP 在中配置 restrict-mode
,默认情况下,适用于店面和管理区域以及中的付款页面 report-only
模式。
对应的 CSP 标题不包含 unsafe-inline
中的关键词 script-src
付款页的指令。 此外,仅限 whitelisted 允许使用内联脚本。
解决方案
由于某些脚本被阻止,用户可能会看到浏览器错误 CSP:
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src
要解决此问题,您必须:
-
Whitelist 阻止的脚本使用
SecureHtmlRenderer
类。 -
使用
CSPNonceProvider
类以允许执行脚本。
Adobe Commerce和Magento Open Source2.4.7及更高版本包括 Content Security Policy (CSP) nonce 提供商,以便于生成唯一的 nonce 每个请求的字符串。 这些 nonce 字符串随后将附加到 CSP 标题。使用
generateNonce
函数位于Magento\Csp\Helper\CspNonceProvider
以获取 nonce 字符串。code language-php use Magento\Csp\Helper\CspNonceProvider; class MyClass { /** * @var CspNonceProvider */ private $cspNonceProvider; /** * @param CspNonceProvider $cspNonceProvider */ public function __construct(CspNonceProvider $cspNonceProvider) { $this->cspNonceProvider = $cspNonceProvider } /** * Get CSP Nonce * * @return String */ public function getNonce(): string { return $this->cspNonceProvider->generateNonce(); } }
-
添加 hash 至模块的
csp_whitelist.xml
文件。
问题 — 管理员无法下订单
管理员无法向管理员提交订单 创建订单页,带有"拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …“浏览器控制台日志中显示错误消息。
重现问题的步骤:
- 转到 Sales > Orders.
- 创建新订单。
- 创建新客户。
- 输入客户详细信息。
- 输入订单详细信息(产品、发运方法)。
- 选择付款方式。
- 提交订单。
预期结果:
您可以成功提交订单。
实际结果:
您无法提交订单。 以下各项 JS 错误显示在浏览器控制台日志中:“拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …"
原因
在Adobe Commerce和Magento Open Source版本2.4.7及更高版本中, CSP 在中配置 restrict-mode
,默认情况下,适用于店面和管理区域以及中的付款页面 report-only
模式。
对应的 CSP 标题不包含 unsafe-inline
中的关键词 script-src
付款页的指令。 此外,仅限 whitelisted 允许使用内联脚本。
解决方案
由于某些脚本被阻止,用户可能会看到浏览器错误 CSP:
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src
要解决此问题,您必须:
-
Whitelist 阻止的脚本使用
SecureHtmlRenderer
类。 -
使用
CSPNonceProvider
类以允许执行脚本。
Adobe Commerce和Magento Open Source2.4.7及更高版本包括 Content Security Policy (CSP) nonce 提供商,以便于生成唯一的 nonce 每个请求的字符串。 这些 nonce 字符串随后将附加到 CSP 标题。使用
generateNonce
函数位于Magento\Csp\Helper\CspNonceProvider
以获取 nonce 字符串。code language-php use Magento\Csp\Helper\CspNonceProvider; class MyClass { /** * @var CspNonceProvider */ private $cspNonceProvider; /** * @param CspNonceProvider $cspNonceProvider */ public function __construct(CspNonceProvider $cspNonceProvider) { $this->cspNonceProvider = $cspNonceProvider } /** * Get CSP Nonce * * @return String */ public function getNonce(): string { return $this->cspNonceProvider->generateNonce(); } }
-
添加 hash 至模块的
csp_whitelist.xml
文件。