在CSP限制模式下对storefront结账页面进行故障排除
本文针对 CSP restricted mode 中查看签出页面时出现的Adobe Commerce 2.4.7问题提供了说明和修复,其中显示“拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src …”浏览器控制台日志中的错误消息。
受影响的产品和版本
云基础架构上的Adobe Commerce、Adobe Commerce内部部署和Magento Open Source:
- 2.4.7
- 2.4.6像素
- 2.4.5-pX
- 2.4.4像素
问题 — Storefront结帐页面已损坏或无法加载
storefront checkout 页面已损坏或无法加载,因为“Refused to execute inline script,因为它违反了以下内容安全策略指令:浏览器控制台日志中的“script-src …”错误消息。
重现步骤:
- 去店面。
- 将产品添加到购物车并继续结帐。
预期的结果:
签出页面会正常完全加载。
实际结果:
签出页面为空或缺少组件。 浏览器控制台日志中显示以下JS错误: “拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …"
原因
在Adobe Commerce和Magento Open Source版本2.4.7及更高版本中,CSP 默认配置为restrict-mode
,适用于店面和管理区域中的付款页面,以及所有其他页面的report-only
模式。
在付款页的script-src
指令中,相应的 CSP 标题不包含unsafe-inline
关键字。 此外,只允许使用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 Source 2.4.7及更高版本包含一个 Content Security Policy (CSP) nonce提供程序,以便为每个请求生成唯一的nonce字符串。 然后将这些nonce字符串附加到CSP标头。在
Magento\Csp\Helper\CspNonceProvider
中使用generateNonce
函数获取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
文件。
问题 — 付款方法缺失或无法正常工作
storefront checkout 页面上缺少付款方法或付款方法不起作用,带有“Refused to execute inline script,因为它违反了以下内容安全策略指令:浏览器控制台日志中的“script-src …”错误消息。
重现步骤:
- 去店面。
- 将产品添加到购物车并继续结帐。
- 选择付款方式。
预期的结果:
您可以选择付款方式并继续成功下单。
实际结果:
付款方式缺失或无法正常工作。 浏览器控制台日志中显示以下JS错误: “拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …"
原因
在Adobe Commerce和Magento Open Source版本2.4.7及更高版本中,CSP 默认配置为restrict-mode
,适用于店面和管理区域中的付款页面,以及所有其他页面的report-only
模式。
在付款页的script-src
指令中,相应的 CSP 标题不包含unsafe-inline
关键字。 此外,只允许使用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 Source 2.4.7及更高版本包含一个 Content Security Policy (CSP) nonce提供程序,以便为每个请求生成唯一的nonce字符串。 然后将这些nonce字符串附加到CSP标头。在
Magento\Csp\Helper\CspNonceProvider
中使用generateNonce
函数获取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
文件。
问题 — 客户无法下订单
客户无法下订单,因为“Refused to execute inline script,因为它违反了以下内容安全策略指令:浏览器控制台日志中显示“script-src …”错误消息。
重现步骤:
- 去店面。
- 将产品添加到购物车并继续结帐。
- 选择付款方式。
- 单击 下单。
预期的结果:
您可以成功下订单。
实际结果:
你无法下订单。 浏览器控制台日志中显示以下JS错误: “拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …"
原因
在Adobe Commerce和Magento Open Source版本2.4.7及更高版本中,CSP 默认配置为restrict-mode
,适用于店面和管理区域中的付款页面,以及所有其他页面的report-only
模式。
在付款页的script-src
指令中,相应的 CSP 标题不包含unsafe-inline
关键字。 此外,只允许使用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 Source 2.4.7及更高版本包含一个 Content Security Policy (CSP) nonce提供程序,以便为每个请求生成唯一的nonce字符串。 然后将这些nonce字符串附加到CSP标头。在
Magento\Csp\Helper\CspNonceProvider
中使用generateNonce
函数获取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
文件。