Magento - 使用自定义环境变量来处理敏感数据库信息

时间:2014-03-13 16:56:04

标签: php .htaccess security magento environment-variables

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

请尝试此解决方案:

将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;
}

答案 3 :(得分:0)

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