2008-09-18 4 views
343

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

+1

Вы имеете в виду пароли пользователей или пароль базы данных, используемые в строке подключения? – 2008-09-18 23:31:55

+3

Пароль базы данных, используемый в строке подключения. Благодаря! – user18359 2008-09-19 00:29:44

ответ

204

Несколько человек неправильно понимают это как вопрос о том, как к хранить пароли в базе данных. Это не правильно. Речь идет о том, как сохранить пароль, который позволяет получить до базы данных.

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

+6

Спасибо. Если я это правильно пойму, тогда в файле php будет добавлен файл конфигурации, позволяющий ему использовать пароль. например Я создаю файл под названием «app1_db_cfg.php», в котором хранятся имя входа, pword и db. Тогда моя страница application.php включает «app1_db_cfg.php», и я в бизнесе! – user18359 2008-09-19 00:40:50

+0

yep, я обычно делаю DEFINE ("DB_NAME", "mydb"); и т. д. также удобно определять все, что вы будете использовать на более чем странице, что вы, возможно, захотите изменить позже. – 2008-09-19 03:33:28

+0

Простое сохранение пароля в файле конфигурации не намного безопаснее. Он должен быть надлежащим образом защищен, используя сильные списки ACL и надежное шифрование с помощью правильно защищенных ключей ... См. Мое сообщение ниже. – AviD 2008-09-21 19:23:54

4

Я думаю, что OP означает пароль базы данных.

Если кто-то не получает доступ к вашему серверу через FTP или SSH (в этом случае вы уже подключены), я бы не стал беспокоиться о сохранении паролей в текстовом формате в файлах PHP. Большинство приложений PHP, которые я видел, делают так, например phpbb.

36

Храните их в файле вне веб-корня.

+26

А также, как упоминалось выше, вне контроля источника. – 2009-05-26 20:46:07

5

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

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

4

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

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

3

Просто поместить его в конфигурационный файл где-то так, как это обычно делается. Просто убедитесь, что вы:

  1. запретить доступ к базе данных с любых серверов за пределами вашей сети,
  2. ухода принять, чтобы случайно не показать пароль для пользователей (в сообщении об ошибке, или через PHP файлы случайный служили в качестве HTML, и т. д.)
7

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

Помимо этого вы находитесь на правильных строках с минимальным доступом к используемой учетной записи.Добавьте к этому

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

Питер

5

Если вы используете PostgreSQL, то она выглядит в ~/.pgpass паролей автоматически. См. the manual для получения дополнительной информации.

3

Дополнительная Хитрость заключается в том, чтобы использовать PHP отдельного конфигурационный файл, который выглядит следующим образом:

<?php exit() ?> 

[...] 

Plain text data including password 

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

Тем не менее, никогда не оставляйте файлы конфигурации в каталоге, доступ к которому можно получить через Интернет. У вас должна быть папка «Веб», содержащая код вашего контроллера, css, картинки и js. Это все. Все остальное идет в автономных папках.

+0

, но тогда как скрипт php считывает учетные данные, хранящиеся в файле? – 2009-01-22 08:40:34

+2

Вы используете fopen(), как для обычного текстового файла. – 2009-01-23 14:56:19

32

Для чрезвычайно безопасных систем мы шифруем пароль базы данных в файле конфигурации (который сам защищен системным администратором). При запуске приложения/сервера приложение затем запрашивает системный администратор для ключа дешифрования. Затем пароль базы данных считывается из файла конфигурации, дешифруется и сохраняется в памяти для будущего использования. Все еще не на 100% безопаснее, так как он хранится в дешифрованной памяти, но вы должны называть его «достаточно безопасным» в какой-то момент!

10

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

mysql_connect("localhost", "me", "mypass"); 

В противном случае это лучше, чтобы сбросить учетные данные после подключения заявления, потому что учетные данные, которые не находятся в памяти, не может быть read from memory;)

include("/outside-webroot/db_settings.php"); 
mysql_connect("localhost", $db_user, $db_pass); 
unset ($db_user, $db_pass); 
3

Лучший способ, чтобы не хранить пароль вообще!
Например, если вы находитесь в системе Windows и подключаетесь к SQL Server, вы можете использовать встроенную проверку подлинности для подключения к базе данных без пароля, используя идентификатор текущего процесса.

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

91

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

<files mypasswdfile> 
order allow,deny 
deny from all 
</files> 
34

Самый безопасный способ - не иметь информацию, указанную в вашем PHP-коде вообще.

Если вы используете Apache, это означает, что вы должны установить данные о соединении в файле httpd.conf или файлах виртуальных хостов. Если вы это сделаете, вы можете вызвать mysql_connect() без параметров, что означает, что PHP никогда не будет выводить вашу информацию.

Это, как вы определяете эти значения в этих файлах:

php_value mysql.default.user  myusername 
php_value mysql.default.password mypassword 
php_value mysql.default.host  server 

Затем открыть соединение MySQL, как это:

<?php 
$db = mysqli_connect(); 

Или так:

<?php 
$db = mysqli_connect(ini_get("mysql.default.user"), 
        ini_get("mysql.default.password"), 
        ini_get("mysql.default.host")); 
12

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

  1. Создайте пользователя ОС для вашего приложения. См http://en.wikipedia.org/wiki/Principle_of_least_privilege
  2. Создать (не сеанс) переменной среды OS для этого пользователя с паролем
  3. запустить приложение под именем этого пользователя

Преимущества:

  1. Вы не проверять ваши пароли в исходное управление случайно, потому что вы не можете
  2. Вы случайно не испортите права доступа к файлам. Ну, возможно, но это не повлияет на это.
  3. Может быть прочитано только root или этим пользователем. Root может читать все ваши файлы и ключи шифрования в любом случае.
  4. Если вы используете шифрование, как безопасно хранить ключ?
  5. Работы х-платформы
  6. Будьте уверены, чтобы не передать envvar к ненадежной дочерних процессов

Этот метод, предложенный Heroku, которые являются очень успешными.

2

Мы решили это таким образом:

  1. Использование Memcache на сервере, с открытым соединение с другого сервера паролей.
  2. Сохраните memcache пароль (или даже весь файл password.php зашифрованный) плюс ключ дешифрования.
  3. На веб-сайте вызывается ключ memcache, содержащий парольную фразу пароля, и дешифрует в памяти все пароли.
  4. Сервер паролей отправляет новый зашифрованный файл паролей каждые 5 минут.
  5. Если вы используете зашифрованный пароль.php в своем проекте, вы отправляете аудит, проверяющий, был ли этот файл тронут внешне - или просмотрен. Когда это произойдет, вы автоматически можете очистить память, а также закрыть сервер для доступа.
3

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

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

Мы переключились на сохранение пользователя/пароля в переменных среды, установленных в Apache VirtualHost. Эта конфигурация читается только с помощью root - надеюсь, ваш пользователь Apache не работает как root.

Кон таким образом, что пароль теперь находится в глобальной переменной PHP.

Чтобы уменьшить этот риск, мы имеем следующие меры предосторожности:

  • Пароль шифруется. Расширяем класс PDO, чтобы включить логику для дешифрования пароля. Если кто-то читает код, где мы устанавливаем соединение, не будет очевидно, что соединение устанавливается с зашифрованным паролем, а не с самим паролем.
  • Зашифрованный пароль перемещается из глобальных переменных в закрытую переменную Приложение делает это немедленно, чтобы уменьшить окно, доступное в глобальном пространстве.
  • phpinfo() отключен. PHPInfo - это легкая цель получить обзор всего, включая переменные среды.
Смежные вопросы