лучший подход, чем хранение mysql пароль в простом тексте в файле конфигурации?

Это всегда беспокоило меня, что много программ PHP требуют, чтобы пользователь сохранил mysql пароль в простом тексте (в строке или константе) в конфигурационном файле в корне приложения.

Там какой-либо лучший подход к этому после всех этих лет?

До сих пор я придумал два минимальных повышения безопасности:

  1. сделайте файл нечитабельным через сеть с помощью правил в .htaccess (в случае, если php перестал работать или существует уязвимость системы обеспечения безопасности для чтения php источника),

  2. удалите пароль в памяти после того, как подключение дб будет сделано (сброшенным) (для предотвращения строковых дампов от нарушения защиты, инжекции, и т.д.)

но конечно ни один из тех не решает исходную проблему.

Спасибо за любые другие идеи!

38
задан ck_ 28 July 2010 в 15:07
поделиться

7 ответов

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

Я добавляю хеш в свою веб-конфигурацию в качестве переменной среды, скажем MYSQL_PASS_HASH

Затем я делаю что-то вроде md5 (getenv ('MYSQL_PASS_HASH'). 'Gibberish $ qwefsdf') , который и является паролем. Конечно, если вы параноик, после этого вам следует unsetenv .

Ваш пароль не будет буквально где-то храниться, и его можно будет восстановить, только если у кого-то есть и ваши веб-настройки и , которые включены в вашу базу данных.

Это происходит в файле вне корневого веб-узла (не доверяйте .htaccess ).

12
ответ дан 27 November 2019 в 03:46
поделиться

Хранение файлов конфигурации вне корня документа - популярный способ повышения безопасности файлов конфигурации.

12
ответ дан 27 November 2019 в 03:46
поделиться

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

Вы можете определить пароль в php.ini (или через настройку ini в конфигурации Apache или .htaccess). Или установите его в среде, когда вы запускаете свой веб-сервер.

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

Если это дешевый пакет хостинга и у вас нет доступного хранилища за пределами корня документа, то сохранение пароля во включаемом файле php внутри должно предотвратить его раскрытие (файл будет проанализирован php вместо загрузки). В качестве альтернативы, простое присвоение файлу имени с расширением «.ht» в начале может предотвратить удаленный доступ.

Обратите внимание, что ваш второй вариант несколько избыточен - если кто-то может нанести такой большой ущерб вашему коду, ему не нужно извлекать пароль из работающего кода.

На самом деле решения проблемы нет.

С.

2
ответ дан 27 November 2019 в 03:46
поделиться

Лично я храню конфиденциальную информацию, такую ​​как сведения о подключении к базе данных, в файле config.ini вне корня моей веб-папки. Затем в моем index.php я могу сделать:

$config = parse_ini_file('../config.ini');

Это означает, что переменные не будут отображаться, если ваш сервер случайно начнет выводить сценарии PHP в виде простого текста (что уже случалось раньше, печально известная для Facebook); и только скрипты PHP имеют доступ к переменным.

Он также не зависит от .htaccess , в котором нет никаких непредвиденных обстоятельств, если ваш файл .htaccess будет перемещен или уничтожен.

Предупреждение, добавлено 14 февраля 2017 г .: теперь я буду хранить такие параметры конфигурации как переменные среды. Я уже некоторое время не использую файл .ini .

25
ответ дан 27 November 2019 в 03:46
поделиться

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

Вы все равно должны быть уверены, что вы защищены от атак с использованием инъекций, которые могут выгрузить эту переменную, и, конечно же, у вас есть ручной шаг в процессе (повторной) загрузки.

1
ответ дан 27 November 2019 в 03:46
поделиться

Он не обязательно должен быть в корневом веб-каталоге. Вы можете переместить файл за пределы корневого каталога и называть его так. Это просто означает, что файл нельзя вызвать напрямую из Интернета.

Если в вашем коде есть недостатки безопасности, такие как включение каких-либо данных без фильтрации из данных GET, то этот файл все еще находится под угрозой. Настоящий ключ - убедиться, что ваше приложение также безопасно.

0
ответ дан 27 November 2019 в 03:46
поделиться

Помимо правильного хранения этих конфиденциальных данных, вы также должны создать отдельного пользователя MySQL , который имеет только необходимые привилегии и ограничить доступ к базе данных / tables / views, к которым у него должен быть доступ. А поскольку сервер базы данных часто запускается на том же компьютере, что и веб-сервер, необходимо также ограничить доступ для локального доступа. Так что не используйте пользователя с привилегиями root, если ему просто нужно читать данные из одной базы данных / таблицы.

2
ответ дан 27 November 2019 в 03:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: