magento2编程最佳实践 之安全性,性能和数据处理

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

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

安全性、性能和数据处理

在 GitHub 上编辑记录问题

您应该确保您的扩展程序小心处理数据,以防止暴露敏感信息。对数据请求或类使用的不正确处理可能会对您的扩展产生负面影响并产生安全漏洞。考虑将以下最佳实践应用于您的扩展程序以提高性能和安全性。

避免使用低级功能

Magento 应用程序由各种组件组成,这些组件协同工作以执行不同的业务功能。我们不鼓励使用低级功能,如PHP curl_*函数,并鼓励使用高级组件,如\Magento\Framework\HTTP\Adapter\Curl. 使用低级功能可以使 Magento 以意想不到的方式运行,从而有效地禁用内置保护机制,引入可利用的不一致,或以其他方式使应用程序受到攻击。

有关不鼓励的低级函数的列表,请查看Magento2/Sniffs/Functions/DiscouragedFunctionSniff.php文件和Magento 编码标准

使用包装器代替超全局变量

确保您的 Magento 应用程序不直接使用任何 PHP 超全局变量,例如:

1
  $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST, $_ENV

而是使用Magento\Framework\HTTP\PhpEnvironment\Request包装类来安全地访问这些值。

使用正确的 MySQL 数据类型

MySQL 提供了一系列数字、字符串和时间数据类型。如果要存储日期,请使用 DATE 或 DATETIME 字段。使用 INTEGER 或 STRING 可以使 SQL 查询更加复杂,如果不是不可能的话。发明自己的数据格式通常很诱人;例如,将序列化的 PHP 对象存储在字符串中。数据库管理可能更容易,但 MySQL 会成为一个愚蠢的数据存储,以后可能会导致问题。

使用 InnoDB 存储引擎

我们建议使用 InnoDB 存储引擎,因为某些云数据库服务不支持其他存储引擎。使用 InnoDB 存储引擎可以确保扩展更加兼容不同的环境。

避免原始 SQL 查询

原始 SQL 查询可能会导致潜在的安全漏洞和数据库可移植性问题。使用数据适配器功能(Magento\Framework\DB\Adapter\Pdo\Mysql默认情况下)来构建和执行查询并将所有数据访问代码移动到资源模型。使用准备好的语句来确保查询可以安全执行。

使用 Magento 数据适配器构建和执行自定义查询不会自动使它们安全。始终对查询中的动态数据使用清理方法。

使用主键

任何数据库集群都需要主键才能有效运行。如果没有主键,您在表复制期间看到性能问题。

使用 Magento API 进行文件系统操作

随着远程存储兼容性的引入,无法保证本地文件系统中存在文件。由于 PHP 文件系统操作不支持 AWS S3 等远程存储解决方案,因此您应该始终使用 Magento Filesystem API 来处理文件系统。

例如,PHP 本机函数file_get_contents()不允许传递任何凭据以对远程存储进行身份验证。如果源文件位于远程存储中,则此功能可能会损坏。

改用\Magento\Framework\Filesystem\File\Read::readAll()方法。您还可以在Magento 编码标准存储库中查看不受支持的 PHP 方法列表。

使用定义良好的索引

外键应该有索引。如果您在 SQL 查询的 WHERE 子句中使用字段,您应该在其上有一个索引。此类索引应根据所需的查询涵盖多个列。作为一般经验法则,索引应该应用于在 SELECT 查询的 WHERE 子句中命名的任何列。

例如,假设我们有一个带有数字 ID(主键)和电子邮件地址的用户表。在登录期间,MySQL 必须通过搜索电子邮件来定位正确的 ID。通过索引,MySQL 可以使用快速搜索算法几乎立即定位电子邮件。如果没有索引,MySQL 必须按顺序检查每条记录,直到找到地址。

向每一列添加索引很诱人,但是,它们会在每个表插入或更新期间重新生成。这会影响性能;仅在必要时添加索引。

避免使用全局事件

只有在极少数情况下才需要使用全局事件。您应该使用frontendadminhtml来缩小范围。

使用 Magento 数据收集

执行 SQL 查询是最耗费资源的操作之一。循环运行 SQL 查询通常会导致性能瓶颈。要加载 EAV 模型,需要执行几个繁重的查询。由于执行查询的数量乘以类别的数量,结果是极其低效和缓慢的代码。Magento 数据集合可以帮助以非常有效的方式加载一组模型,而不是循环加载模型。

验证输入并正确编码或转义输出

请记住始终验证来自不可信数据源的数据。清理进入您的扩展程序并由它生成的数据将提高整体安全性。

例如,为了防止 XSS 漏洞,避免创建在没有正确HTML编码的情况下输出未经验证的用户提供数据的方法。

始终加密敏感数据或配置

切勿将敏感信息以明文形式存储在其他控制领域可能访问的资源中。此类信息应加密或以其他方式受到保护。

避免不必要的逻辑执行

确保您永远不会运行不会在下一步中使用的代码。

检查下面的例子,我们总是得到customerIdand storeId,但我们不会使用它们。

例子


public function getCustomerCart()
{
    $customerId = (int) $this->getSession()->getCustomerId();
    $storeId = (int) $this->getSession()->getStoreId();

    if ($this->_cart !== null) {
        return $this->_cart;
    }

    ...
    $this->_cart = $this->quoteRepository->getForCustomer($customerId, [$storeId]);
    ...

    return $this->_cart;
}

使用适当的区域

确保您的观察者或插件在正确的区域中声明:

插件和观察者应该在<module-dir>/etc/<area>/目录中声明。

global仅当插件/观察器应在多个区域中执行时才使用该区域。

这是NOT RECOMMENDED注册global区域中的所有内容,因为引导过程将变得更加繁重。例如,应用程序必须为您的插件/观察器运行和处理额外的检查。

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