Насколько безопасно хранить переменные DB с помощью SetEnv или php.ini?

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

PROS n CONS:

SetEnv:

+ Хранится вне DOCUMENT_ROOT
+ Доступ только к данному объекту
-Visible with PHPINFO () – Хакеру нужен прямой доступ / загрузка эксплойта в файлы

get_cfg_var:

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

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

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

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

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

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

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

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

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

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

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

    Misconfiguration может раскрывать содержимое nonPublicFiles даже без скрипта.

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

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