В PHP-приложении, которое я пишу, я не хотел бы предоставлять учетные данные рабочей БД другим разработчикам.
Я прочитал несколько вопросов и ответов здесь, на SO, например, в следующей ветке есть много интересных мыслей относительнотема:
Как защитить пароли базы данных в 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
, который находится вне документаroot:
<?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который, в свою очередь, кажется, не раскрывает учетные данные, которые он использует для подключения к базе данных:
<?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, код приложения, конечно, все еще может получить содержимое файла и, следовательно, получить доступ к учетным данным, поэтому все мои рассуждения были неверны, поскольку он не рассматривал этот очень простой случай.Думаю, мне нужно найти другую стратегию, если она существует ...