【问题标题】:Magento - Using custom Environment Variables for sensitive database infoMagento - 使用自定义环境变量获取敏感数据库信息
【发布时间】:2014-04-18 14:24:04
【问题描述】:

我知道 Magento 将数据库连接详细信息存储在 local.xml 文件中,但是出于安全目的,我们公司正在努力避免将密码和其他敏感数据存储在我们的 git 存储库中。

我知道您可以通过.htaccess 文件轻松创建环境变量,但我希望找到一个可行的解决方案,使我能够从环境变量中动态设置此数据库信息。

由于local.xml 是一个 XML 文件,而且这是一个非动态/服务器端文件类型,我们不能使用它来读取环境变量。

是否有办法以某种方式向 Magento 添加一些钩子/自定义行为,在其中我可以将 local.xml 替换为允许我提取这些环境变量的 PHP 文件?

所以从某种意义上说,local.XML 将成为一个local.PHP 文件,能够读取我自己的自定义环境变量,例如DB_HOST, DB_USERNAME, DB_PASSWORD,而不是在xml 文件中将它们设置为localhost, root, password123 等。

关于如何最好地实现这一点的任何想法,或者是否有任何现有的 Magento 附加组件/扩展/模块可以让我做到这一点?

【问题讨论】:

  • 我正在寻找完全相同的东西,所以我在谷歌上找到的第一个结果是这个未回答的问题,并没有让我充满信心。
  • 我第一次收到我认识的人的回复 :)

标签: php .htaccess security magento environment-variables


【解决方案1】:

我建议 git 忽略您的 local.xml 并使用您的部署脚本动态创建它。您的部署脚本应该包含您的敏感数据变量。

【讨论】:

    【解决方案2】:

    请试试这个解决方案:

    将 app/code/core/Mage/Core/Model/App.php 复制到 app/code/local/Mage/Core/Model/App.php 并将 _initBaseConfig() 方法替换为以下方法:

    protected function _initBaseConfig()
    {
        Varien_Profiler::start('mage::app::init::system_config');
        $this->_config->loadBase();
    
        /* Read DB connection config from environment variables */
        $connection = $this->_config->getNode('global/resources/default_setup/connection');
        $connection->setNode('host', $_ENV['DB_HOST']);
        $connection->setNode('username', $_ENV['DB_USERNAME']);
        $connection->setNode('password', $_ENV['DB_PASSWORD']);
    
        Varien_Profiler::stop('mage::app::init::system_config');
        return $this;
    }
    

    这一定有帮助。

    * 编辑

    protected function _initBaseConfig()
    {
        Varien_Profiler::start('mage::app::init::system_config');
        $this->_config->loadBase();
    
        /* Read DB connection config from environment variables */
        $this->_config->getNode('global/resources/default_setup/connection')
            ->setNode('host', $_ENV['DB_HOST'])
            ->setNode('username', $_ENV['DB_USERNAME'])
            ->setNode('password', $_ENV['DB_PASSWORD']);
    
        Varien_Profiler::stop('mage::app::init::system_config');
        return $this;
    }
    

    【讨论】:

    • 这个'有点'有效 - 我使用了 getenv() 而不是 $_ENV - htaccess 变量现在被 pssed 到这个 _initBaseConfig() 函数中。你现在知道如何将 $connection 变量设置为默认数据库连接。在这种情况下,它需要在开始时使用 Magento 默认设置覆盖现有的数据库设置。
    • $connection 只是一个临时变量,用于方便更改 Magento 配置。换句话说,您根本不需要使用 $connection 变量。见上面的例子(我已经编辑了答案)
    【解决方案3】:

    您是否考虑过简单地将local.xml 添加到.gitignore 并在部署过程中创建/更新它?请注意,local.xml 通常存储的不仅仅是数据库凭据。例如,它还可能将缓存后端的配置存储为会话存储。这些通常也是特定于服务器的,如果您尝试避免使用local.xml,将会使事情变得非常混乱。

    【讨论】:

      【解决方案4】:

      我找到了该问题的替代解决方案。我扩展了 Mage_Core_Model_Config_Element 并覆盖了“xmlentities”函数,以检查它返回的配置值是否以美元符号开头,如果是,则将其替换为等效的环境变量。

      如果它对其他人有帮助,那就是……

      https://github.com/rossigee/magento-config-envvars

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-19
        • 2020-06-02
        • 1970-01-01
        • 2015-08-10
        • 2017-10-14
        • 2020-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多