PHP и MySQL-как избежать пароля в исходном коде? [дубликат]


этот вопрос уже есть ответ здесь:

у меня есть небольшое PHP-приложение, хранящее данные в MySQL

9 108

9 ответов:

самый простой способ, как вы сказали, использовать файл конфигурации.

многие фреймворки используют это (Zend,CakePHP,Кохана и т. д.), И это самый распространенный способ делать вещи (даже в среде, отличной от PHP, такой как ASP.NET с его web.config файлы). Это позволяет также копировать значения конфигурации из среды в среду, просто копируя файлы для сайта, что является преимуществом по сравнению с использованием среды установки сервера переменные (которые очень быстро могут быть потеряны и забыты).

вам не нужно беспокоиться о запутывании пароля, так как это не доступный в мире файл, он, безусловно, не должен быть доступен в интернете. Я имею в виду, что вы либо скажете своему веб-серверу не обслуживать ваш файл конфигурации (IIS уже делает это с web.config файлы и обслуживает статус HTTP 404.8 вместо содержимого) или B) переместите его за пределы вашего каталога веб-службы. Если кто-то может видеть ваш конфигурационный файл, это хуже, чем иметь его в исходном коде.

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

переменная окружения является наиболее распространенным способом различать эти среды, что-то вроде ниже код:

// Check if it's been set by the web server
if (!empty($_ENV['ENVIRONMENT'])) {
    // Copy from web server to PHP constant
    define('ENVIRONMENT', $_ENV['ENVIRONMENT']);
}

if (!defined('ENVIRONMENT')) {
    // Default to development
    define('ENVIRONMENT', 'development');
}

// Load in default configuration values
require_once 'config.default.php';

// Load in the overridden configuration file for this environment
require_once 'config.' . ENVIRONMENT . '.php';

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

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

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

одно довольно хорошее решение, если вы находитесь на Apache, это хранить информацию в конфигурации virtualhost

SetEnv  MYSQL_USER     "xx"
SetEnv  MYSQL_PASSWORD "y2wrg435yw8"

данные могут быть легко извлечены с помощью $_ENV[] для использования в коде.

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

Это также хорошая идея, чтобы имя файла config.php, а не config.ini в случае, если каталог не случайно разоблачила, означает, что файл не будет загружен, а он ничего не возвращает.

Если вы чувствуете, что 12factor путь ценен, они рекомендуют хранить config в окружающей среде.

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

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

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

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

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

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

host: localhost
user: root
pass: root
name: db

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

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

вы всегда можете создать конфигурационный ini-файл с помощью функции parse_ini_file.