【问题标题】:Windows environment variable vs Config fileWindows 环境变量与配置文件
【发布时间】:2012-02-25 04:56:50
【问题描述】:

我正在开发一个网络应用程序。它是基于 PHP 的,带有 Apache Web 服务器。

在生产服务器中,应用程序会从 Windows 环境变量中提取一些“敏感”信息,例如数据库密码和数据库用户名。这样做不是将信息放入应用程序内的配置文件中。

我自己一直在使用配置文件,所以我考虑了优点/缺点。我看不出以他们的方式做这件事有多大好处,但我确信我没有正确地考虑它。

这是我的看法:

缺点

  1. 任何可以访问 windows 机器的人都可以直接进入 windows 环境变量并查看它们。

  2. 如果不关闭服务器,就无法更改信息。在某些情况下,我们更改了环境变量并且必须完全关闭 apache 才能完全重新加载新值。

优势

  1. 当从 dev 转移到 qa 到 prod 机器时,不必更改应用程序配置文件,因为每个服务器都已在环境变量中设置了必要的数据。 (我不必“记住”使用正确的配置文件,因为已经为每个服务器设置了环境变量)。

  2. 可以加强安全性,因此只有管理员才能真正看到环境变量。不确定 Windows 是否可以这样做,但我确定有一些注册表编辑可以允许这样做。

你的观点是什么?

【问题讨论】:

    标签: php windows apache


    【解决方案1】:

    您真正谈论的是控制对敏感信息的访问,而做到这一点的最佳方法是使用底层操作系统中内置的_access_control_机制。在我看来,您无法在 Apache 级别使用环境变量有效地做到这一点,所以我发现很难想到 任何 令人信服的优势会让我支持这个选项。

    您可以使用文件来存储内容,例如具有适当访问控制的config.php 文件。将此文件的范围限制为仅设置要保护的有限数量的参数。例如

    <?php
    $DBuser   = "abd";
    $DBpasswd = 'fred:ere12#';
    

    只有服务器上对文件具有读取权限的人才能破坏此功能。 (即使它在网络可访问的目录中,通过 URI 访问它也不会显示此信息。你明白为什么吗?)

    正如 paulsm4 所建议的那样,通过加密来混淆这一点将防止任何具有随意读取访问权限的人看到这些数据。 然而,这不是一种安全机制,因为我们应该假设任何有权访问 config.php 文件的人也有权访问读取和解码这些参数的脚本,并且可以简单地重新设计它过程。

    事实上,在我的应用程序中,我使用了一种稍微不同的方法,我举个例子。我在一个小的 index.php 引导程序中使用定义(应用程序是 OO OO 并且不使用全局变量),并将所有其他配置数据保存在我的 D/B 中

    <?php
    define( 'SQL_CONTEXT', 'DB:user:pwd:tableprefix' );
    define( 'ROOT_DIR', dirname(__FILE__) );
    define( 'START_TIME', microtime() );
    // a couple of other app-specific defines go here
    
    if( ( @include( "./_cache/dispatcher.class.php" ) ) != 1 ) {
        require("./_include/functions.php");
    }
    
    Dispatcher::dispatch();
    

    这是为 dev、我的测试 VM 和 prod 构建的,通过安装脚本进行了一些编辑,以便将此敏感信息插入 APPROOT/index.php,因此我不需要将此敏感信息保留在我的git 存储库。

    【讨论】:

    • 你明白为什么吗?好吧,apache 仍然会“服务”它,对吗?但是由于脚本设置了 php 变量并且不打印任何内容,所以他们看不到任何内容吗?如果它是一个文本配置文件,那么它会出现在公共目录中。
    【解决方案2】:

    我会选择对您更方便的操作(听起来环境变量让您的生活更轻松 - 然后去吧)...

    ...然后加密文本字符串。

    【讨论】:

    • 嗯,对,两者都很方便。但我一直在寻找每种方法的更多优点和缺点。
    【解决方案3】:

    假设 Windows NT 架构(8、7、Vista、XP...)

    如果用户 A 有一个 USER 环境变量“PASSWORD”,那么用户 B(不是管理员)无法读取用户 A 的 USER 环境变量“PASSWORD”,所以只要用户 B 不是管理员,它就是安全的。

    您应该以不同的用户身份运行不同的程序。

    您还应该保护对计算机的物理访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 2015-08-20
      • 2015-03-27
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      相关资源
      最近更新 更多