订单创建页面疑难解答 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 …“浏览器控制台日志中显示错误消息。

重现问题的步骤

  1. 转到 Sales > Orders.
  2. 创建新订单。

预期结果

管理员 创建订单 页面会正常完全加载。

实际结果

管理员 创建订单 页面为空或缺少组件。 以下各项 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

要解决此问题,您必须

  1. Whitelist 阻止的脚本使用 SecureHtmlRenderer 类。

  2. 使用 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();
        }
    }
    
  3. 添加 hash 至模块的 csp_whitelist.xml 文件。

问题 — 付款方法缺失或无法正常工作

管理员缺少付款方法或无法使用该方法 订单创建页面,带有"拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …“浏览器控制台日志中显示错误消息。

重现问题的步骤

  1. 转到 Sales > Orders.
  2. 创建新订单。
  3. 创建新客户。
  4. 输入客户详细信息。
  5. 输入订单详细信息(产品、发运方法)。
  6. 选择付款方式。

预期结果

您可以选择付款方式并继续成功下单。

实际结果

付款方式缺失或无法正常工作。 以下各项 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

要解决此问题,您必须

  1. Whitelist 阻止的脚本使用 SecureHtmlRenderer 类。

  2. 使用 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();
        }
    }
    
  3. 添加 hash 至模块的 csp_whitelist.xml 文件。

问题 — 管理员无法下订单

管理员无法向管理员提交订单 创建订单页,带有"拒绝执行内联脚本,因为它违反了以下内容安全策略指令: "script-src …“浏览器控制台日志中显示错误消息。

重现问题的步骤

  1. 转到 Sales > Orders.
  2. 创建新订单。
  3. 创建新客户。
  4. 输入客户详细信息。
  5. 输入订单详细信息(产品、发运方法)。
  6. 选择付款方式。
  7. 提交订单。

预期结果

您可以成功提交订单。

实际结果

您无法提交订单。 以下各项 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

要解决此问题,您必须

  1. Whitelist 阻止的脚本使用 SecureHtmlRenderer 类。

  2. 使用 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();
        }
    }
    
  3. 添加 hash 至模块的 csp_whitelist.xml 文件。

recommendation-more-help
8bd06ef0-b3d5-4137-b74e-d7b00485808a