magento安全策略CSP讲解
《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中文网】,并添加本文地址链接。
如未按上述操作复制或转载,本站有权追究法律责任。
若本站内容侵犯了原著者的合法权益,可联系我们进行处理。