Насколько безопасно хранение переменных БД с помощью SetEnv или в php.ini? - PullRequest
8 голосов
/ 02 июля 2011

Мне не нравится хранить шифрованные ключи и информацию о доступе к БД в document_root, поэтому я использовал файлы Apache SetEnv и php.ini в conf.d, чтобы отделить их от базы кода. Большой вопрос, какой из них лучше? Внутри переменных окружения в файлах apache vhost (SetEnv SITEKEY 'oinkoink!') или внутри файлов conf.d / xxx.ini (db_pass="oink?")? Может быть что-то еще?

PROS n CONS:

SetEnv:

+ Хранится вне DOCUMENT_ROOT
+ Только данный vhost имеет доступ
-Видим с PHPINFO () - Хакеру нужен прямой доступ / загрузка эксплойта к файлам

get_cfg_var:

+ Хранится вне DOCUMENT_ROOT
+ Не отображается с помощью PHPINFO ()
- (ОЧЕНЬ ПЛОХО) Все заданные переменные ini включены, поэтому каждый vhost может запрашивать их через (ini_get_all), поэтому их нельзя использовать в общей среде vhost

Ответы [ 3 ]

4 голосов
/ 02 июля 2011

Пока * .ini и SetEnv находятся за пределами корневого веб-каталога (корня документа), это не имеет значения в любом случае.Просто выберите тот, который вы предпочитаете.Мне нравится SetEnv, но на самом деле это просто личные предпочтения.Для меня имеет больше смысла использовать SetEnv, поскольку переменные помещаются в _SERVER.Я думаю, что с .ini имеет смысл оставить его для параметров инициализации, специфичных для того, как работает код.

Не хранить под корнем документа - хорошая идея, чтобы предотвратить доступ к, возможно, защищенным данным.

Обратите внимание, что phpinfo() будет перечислять любые установленные серверные переменные, поэтому будьте очень осторожны с этим.

Наконец, если вы включаете файлы, убедитесь, что вы не разрешаете безвозмездно ../../ установленный пользователем каким-либо образом, или у него будет доступ к потенциально защищенным файлам (даже включая /etc/passwd!)

Я думаю, что ваш главный вопрос - «насколько безопасен».Ну, это, вероятно, настолько безопасно, насколько вы можете получить, не вызывая больших головных болей.Код php имеет доступ к этим переменным, поэтому, если вы распечатываете их, они легко видны, поэтому это зависит от того, насколько безопасна ваша кодовая база.Может быть возможно использовать LDAP с MySQL, но это звучит как огромная боль.

1 голос
/ 02 июля 2011

Я предпочитаю хранить их в непубличных папках, к которым может получить доступ только apache, или за пределами document_root.

1 голос
/ 02 июля 2011

Обычной практикой является использование закрытых файлов за пределами document_root. Типичный макет может быть таким:

.../myProject
.../myProject/documentRoot
.../myProject/documentRoot/.... 
.../myProject/nonPublicFiles
.../myProject/nonPublicFiles/...

Храните ваши PHP-вещи в documentRoot и все непубличные материалы в nonPublicFiles . documentRoot будет Apache document_root vHost. Поскольку nonPublicFiles находится за пределами, Apache не будет отвечать на запрос.

Если говорить о безопасности, SetEnv или *. Ini имеют тенденцию быть эквивалентными: в случае, если кто-то получает права на выполнение произвольного PHP-кода, оба способа предоставляют разумную информацию этому коду.

Я бы предпочел метод SetEnv и *. Ini , поскольку Apache сам не раскрывает эти детали. Требуется скрипт.

Неверная конфигурация может раскрыть содержимое nonPublicFiles даже без сценария.

Если вы собираетесь использовать nonPublicFiles , подготовьте заранее сценарий, который проверяет, все ли в порядке, и отправьте электронное письмо, если оно обнаружит проблемы. Вероятно, позвоните с помощью CRON.

...