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