magento安全策略CSP讲解

7天成为Magento系统架构师,现在开始学习Magento全栈开发!

《Magento2.X企业级开发实战》

内容安全策略 (CSP) 是一种强大的工具,可用于缓解跨站脚本 (XSS) 和相关攻击,包括卡片浏览器、会话劫持、点击劫持等。Web 服务器将 CSP 作为响应 HTTP 标头(即Content-Security-Policy和 Content-Security-Policy-Report-Only)发送到浏览器,这些浏览器将脚本、样式和其他资源的来源列入白名单。CSP 和内置浏览器功能一起有助于防止:

从攻击者的网站加载恶意脚本
将信用卡信息发送到攻击者网站的恶意内联脚本
加载恶意样式,使用户点击不应该出现在页面上的元素
请参阅内容安全策略 (CSP) 和内容安全策略 以了解有关 CSP 和每个单独策略的更多信息。

Magento 和 CSP
从 2.3.5 版本开始,Magento 支持 CSP 标头并提供配置它们的方法。(此功能在 Magento_Csp 模块中定义。) Magento 还在应用程序级别和需要额外配置的单个核心模块提供默认配置。可以分别为adminhtml和storefront区域配置策略以适应不同的用例。Magento 还允许为特定页面配置唯一的 CSP。

CSP 可以在两种模式下工作:

report-only- 在这种模式下,Magento 报告违反政策但不干预。这种模式对于调试很有用。默认情况下,CSP 违规会写入浏览器控制台,但可以将它们配置为以 HTTP 请求的形式向端点报告以收集日志。有许多服务可以为您收集、存储和分类商店的 CSP 违规报告。

restrict mode- 在这种模式下,Magento 会对任何违反政策的行为采取行动。

默认配置
默认情况下,CSP 配置为report-onlymode,允许商家和开发人员配置策略以根据他们的自定义代码工作。配置策略后,将模式切换为restrict。

配置后,Magento 可以强制执行以下策略:

  • 任何资源,例如.js、.css、.jpg或.ttf文件,都只能从商店的域中加载
  • iframe 只能包含商店本身的页面
  • AJAX 请求只能发送到商店
  • 表格只能发送到商店
  • 浏览器只能编译列入白名单的内联脚本和样式
    有关更多详细信息,请检查Magento/Csp/etc/config.xml文件。对于需要它的模块,一些域已经被列入白名单。例如,如果Magento_Paypal模块已安装, www.paypal.com则已将其列入script-src策略白名单。Content-Security-Policy如果内联脚本和样式也被列入白名单,则仅当不允许内联脚本/样式时,它们的哈希才会添加到标题中。

请注意,这eval()仍然是允许的。

配置模块的 CSP 模式
您可以通过编辑模块etc/config.xml文件在自定义模块中设置 CSP 模式。要将模式设置为,请将 和/或元素restrict的值更改为 0。要启用模式,请将值设置为 1。default/csp/mode/admin/report_onlydefault/csp/mode/storefront/report_onlyreport-only

示例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>

您可以使用模块中的etc/config.xml文件Magento_Csp作为参考。 创建你的组件文件结构 描述了如何创建一个模块。

为您的自定义代码/扩展/主题配置 CSP
Magento 提供了多种方法来将列入白名单的资源添加到您的自定义代码、扩展或主题中。确保仅在需要它的模块中添加资源。例如,default-src 当您只需要从中加载.js文件时,不建议将域添加到策略中。改为添加域script-src 。

下表描述了每种类型的 CSP:

政策名称 描述
default-src 默认策略。
base-uri 定义哪些 URL 可以出现在页面元素中。
child-src 定义工作人员和嵌入框架内容的来源。
connect-src 定义可以使用脚本接口加载的源。
font-src 定义哪些源可以提供字体。
form-action
定义从标签提交的有效端点。
frame-ancestors 定义可以嵌入当前页面的来源。
frame-src 定义元素的来源,例如<frame><iframe>
img-src 定义可以从中加载图像的源。
manifest-src 定义 Web 应用清单的允许内容。
media-src 定义可以从中加载图像的源。
object-src 定义<object>、<embed>元素的来源。
script-src <script>定义 JavaScript元素的来源。
style-src 定义样式表的来源。

将域添加到白名单
您可以通过将 a 添加到自定义模块的文件夹中,将域添加到策略(如script-src、和其他)的白名单中。style-srcfont-srccsp_whitelist.xmletc

<?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"></value>
                <value id="magento" type="host">https://magento.com</value>
            </values>
        </policy>
        <policy id="connect-src">
            <values>
                <value id="devdocs" type="host"></value>
            </values>
        </policy>
    </policies>
</csp_whitelist>

将内联脚本或样式列入白名单
unsafe-inline禁用style-src和(Magento 2.4 默认)内联脚本和样式的商店script-src必须列入白名单。

您必须使用.phtmlMagento\Framework\View\Helper\SecureHtmlRenderer模板中的$secureRenderer变量来实现此目的。

对于包含内联 JavaScript/CSS 的script或style标记,请使用renderTag:
在 .phtml 模板内

<div>Other content</div>
<?= $secureRenderer->renderTag('script', ['type' => 'text/javascript'], "\nconsole.log('I am a whitelisted script');\n", false); ?>

在一个负责 HTML 渲染的类中_

/** @var \Magento\Framework\View\Helper\SecureHtmlRenderer */
private $secureRenderer;

...

function someMethod() {
   ....

   $html .= $this->secureRenderer->renderTag('style', [], "#element { color: blue } ", false);

   ....
}

对于之前在 HTML 属性中定义的事件处理程序,请使用renderEventListenerAsTag:
在 .phtml 模板内

<!-- <div onclick="alert('Old way!')">Old way</div> -->

<div id="alert-div">New way</div>
<?= $secureRenderer->renderEventListenerAsTag('onclick', 'alert("New way!");', '#alert-div'); ?>
style对于先前在属性中定义的内联样式,请使用renderStyleAsTag:
在 .phtml 模板内
<!-- <div style="color:blue">Old way</div> -->

<div id="blue-div">New way</div>
<?= $secureRenderer->renderStyleAsTag('color: blue', '#blue-div'); ?>

不鼓励使用内联脚本和样式,而是使用 UI 组件和类
您还可以将内联 CSS 和 JSstyle以及文件script中的标签列入白名单csp_whitelist.xml。为此,获取sha256标签内容的哈希并将其编码为 BASE64,然后将其添加到模块的csp_whitelist.xml. 以编程方式,它可能如下所示:

$whitelistHash = base64_encode(hash(‘sha256’, $content, true));
将相应的策略添加到csp_whitelist.xml文件中:

<?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="my-scripts-hash" type="hash" algorithm="sha256">B4yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8=</value>
            </values>
        </policy>
    </policies>
</csp_whitelist>

当unsafe-inline被允许用于script-src或style-src策略时,列入白名单的内联脚本/样式哈希将不会出现在Content-Security-Policy标题中。
高级 CSP 配置
要配置其他 CSP,例如sandbox不包含白名单主机和哈希的策略,或者要配置更高级的fetch策略配置,例如从 中删除内联支持script-src,您必须config.xml在自定义模块中创建一个文件并重写默认值。供参考,请参阅Magento\Csp\etc\config.xml。

报告-Uri 配置
无论何种模式restrict,report-onlyCSP 违规都可能被报告给端点以供收集。浏览器用于报告的 URL 可以在自定义模块的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_uri>http://csp-reporting-service.com/my-project/endpoint</report_uri>
                </storefront>
                <admin>
                    <report_uri>http://csp-reporting-service.com/my-project/endpoint</report_uri>
                </admin>
            </mode>
        </csp>
    </default>
</config>

页面特定的内容安全策略
Magento 可以为特定页面发送独特的策略。为此,请Magento\Csp\Api\CspAwareActionInterface 在负责页面的控制器中实现并定义modifyCsp方法。它接收从配置中读取的现有 CSP,并允许您通过返回新列表来重新定义它们。请参见下面的示例:

class Mypage extends \Magento\Framework\App\Action\Action implements \Magento\Csp\Api\CspAwareActionInterface
{
    /**
     * My custom page.
     *
     * @inheritDoc
     */
    public function execute()
    {
        return $this->resultPageFactory->create();
    }

    public function modifyCsp(array $appliedPolicies): array
    {
        $appliedPolicies[] = new \Magento\Csp\Model\Policy\FetchPolicy(
            'form-action',
            false,
            ['https://my-site.com'],
            ['https']
        );

        return $appliedPolicies;
    }
}

您不需要在unsafe-inline等上下文中定义其他策略选项。从配置中读取的相同策略选项将在稍后合并。

如无特殊说明或标注,任何个人或组织,复制、转载、采集本站内容请注明:
本文来源于:【Magento中文网】,并添加本文地址链接。
如未按上述操作复制或转载,本站有权追究法律责任。
若本站内容侵犯了原著者的合法权益,可联系我们进行处理。