代码之家  ›  专栏  ›  技术社区  ›  tonix

如何不向其他开发人员公开生产数据库凭据?

  •  0
  • tonix  · 技术社区  · 6 年前

    在我正在编写的PHP应用程序中,我不想向其他开发人员公开产品DB凭据。

    我在这里阅读了一些问题和答案,例如,下面的主题有许多有趣的想法:

    How to secure database passwords in PHP?

    假设我正在使用PDO,并且在我的应用程序容器中创建了PDO实例:

    <?php
    
    // ...
    require_once __DIR__ . '/../db_pdo_outside_document_root.php';
    
    $containerConfig = [
       'db_connection' => function() {
          return new PDO(DB_PDO_DSN, DB_PDO_USER, DB_PDO_PASSWD, DB_PDO_OPTIONS);
       }
    ];
    $appContainer = new ApplicationContainer($containerConfig);
    
    // Use the container and handle the request...
    

    这个 DB_PDO_* 传递给PDO构造函数的常量都来自文件 db_pdo_outside_document_root.php 在文档根目录之外:

    <?php
    // db_pdo_outside_document_root.php
    define('DB_PDO_DSN', 'mysql:host=localhost;dbname=app_database');
    define('DB_PDO_USER', 'db_user');
    define('DB_PDO_PASSWD', 'db_fancy_passwd');
    define('DB_PDO_OPTIONS', [
        PDO::ATTR_PERSISTENT => false,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
    

    <?php
    
    // In some PHP file used by the application... 
    
    echo DB_PDO_PASSWD; // echoes the DB password.
    //mail('developer@mail.com', 'Subject', DB_PDO_PASSWD); // Or send it by email
    

    现在,当然,你必须信任你的同事,但谁知道,有时候员工会离开,也许会被解雇,等等。我们也不希望他们有机会以某种方式将生产数据库凭据存储在他们的计算机上。

    所以我想,也许文件本身可以返回PDO对象,而不是在文件中定义常量,而PDO对象似乎不会公开它用来连接数据库的凭据:

    <?php
    
    // ...
    
    var_dump($appContainer->get('db_connection'))
    

    输出如下:

    /path/to/htdocs/file.php:4:
    object(PDO)[13]
    

    <?php
    
    // ...    
    
    $containerConfig = [
       'db_connection' => function() {
          return require_once __DIR__ . '/../db_pdo_outside_document_root.php';
       }
    ];
    $appContainer = new ApplicationContainer($containerConfig);
    
    // Use the container and handle the request...
    

    在外部文件中:

    <?php
    // db_pdo_outside_document_root.php
    return new PDO('mysql:host=localhost;dbname=app_database', 
    'db_user', 'db_fancy_passwd', [
        PDO::ATTR_PERSISTENT => false,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);;
    

    您认为其他开发人员是否能够以某种方式从 $appContainer->get('db_connection') (假设它返回上面的PDO对象)?

    ReflectionClass 我看不到这个物体的任何属性:

    <?php
    
    //...
    
    $ref = new ReflectionClass($appContainer->get('db_connection'));
    var_dump($ref->getProperties());
    

    输出:

    /path/to/htdocs/file.php:4:
    array (size=0)
      empty
    

    我想听听你的意见。

    谢谢你的关注。

    EDI:IsThisJavascript指出,应用程序的代码当然仍然可以获取文件的内容,从而访问凭证,因此我的整个推理是不正确的,因为它没有考虑到这个非常简单的情况。 我想我必须找到另一个策略,如果存在的话…

    3 回复  |  直到 6 年前
        1
  •  1
  •   user3277192 user3277192    6 年前

    你可以结合两种策略:

    一。分离开发和生产环境

    最容易让它们“包括”数据库的位置、使用的帐户和配置文件中的密码,这些配置文件在生产和开发方面是不同的。

    2。为用户提供个人帐户

    在开发数据库服务器上为开发人员提供单独的帐户,这样他们就可以获得(单独的)他们可以使用的所有数据库,而您仍然可以拥有测试环境,在这些环境中,可以使用更类似于生产的数据库来完成集成(因此可以更好地控制可能发生在他们身上的情况)

    这需要对每个新招聘的开发人员进行一点用户管理,并在他们离开时采取一些行动,但让您的内部it支持人员在他们的检查表上添加一个项目以及创建/删除电子邮件地址等并不是那么困难。

    ->这允许开发人员在一个区域内做他们喜欢做的任何事情,而不影响彼此,一旦他们离开,您可以将其全部存档并脱机。

        2
  •  0
  •   IMB    6 年前

    如果您有一个开发服务器和一个生产服务器,那么您的开发人员不需要知道生产数据库的密码。如果您的开发人员直接在生产服务器上工作,那么实际上没有办法避免您的问题。通常只有sysadmin/devops知道DB密码,并在生产服务器中设置密码。您的开发人员应该有0访问权限。

        3
  •  0
  •   Stratadox    6 年前

    最常见的解决方案是使用 .env 用于存储代码库所需凭据的文件。

    .env环境 具有开发凭据的文件,生产凭据仅在生产环境中可用。

    这个 文件保存在文档根目录中,但不随代码分发:它不会添加到存储库(git/svn)

    .env.example 文件包含在基本开发变量中,例如外部API的测试环境路径和本地数据库的示例数据库凭据。与…对比 .env环境 , 添加到源代码管理存储库。

    在代码方面,可以使用如下库 dotenv .env环境 文件。

    代码审查还有许多其他好处:在代码的每一部分都有一个额外的关注点,可以防止错误并鼓励开发人员相互学习。