Всегда ли хранить пароль в виде обычного текста в переменной php или константе php?

В соответствии с вопросом, безопасно ли хранить пароли на php-страницах, например

$password = 'pa$$w0rd';

Если пользователи не могут его увидеть, это безопасно, правильно?

EDIT: Некоторые люди действительно предложили использовать хеш, однако возникла бы проблема с паролем подключения к серверу базы данных, не так ли?

Ответ 1

Короткий ответ - это как "Нет", так и "Зависит".

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

Если вы ДОЛЖНЫ хранить пароль (что возможно), вы можете попытаться сохранить его за пределами webroot, например /var/www/public_html/ Поместите свой кодз здесь
/var/www/includes/ Поместите здесь свои пароли

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

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

Кроме того, если его пароль к вашему подписчику с подписью supa-secrit, meh, все, что вы потеряли, это некоторые абонентские платы, если у вас есть база данных, у вас может возникнуть проблема, если это ваши банковские реквизиты в Интернете, вы.

Насколько ценна защита пароля?

Ответ 2

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

Если вы действительно хотите сохранить пароль в своем источнике, может быть хорошей идеей сделать что-то подобное:

Файл: config.php

if( ! defined('IN_CODE') ) die( 'Hacking attempt' );

define( 'PASSWORD_HASH', '098f6bcd4621d373cade4e832627b4f6' );

Файл: index.php

define( 'IN_CODE', '1' );

include( 'passwd.php' );

if( md5($password) == PASSWORD_HASH )
...

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

Кроме того, попытайтесь выполнить seperate, как это описано в основном исходном файле.

Ответ 3

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

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

Если вы хотите использовать макет каталога метода файла, он должен выглядеть примерно так (depneds on server)

/public_html/index.php

/password.txt

$myFile = $_SERVER['DOCUMENT_ROOT'] + "/../password.txt";
if file_exists($myFile) { 
   $fh = fopen($myFile, 'r');
   $password = fgets($fh);
   fclose($fh);
} else die("No password file");
if ($user_input == $password) {
   ...... Authentication succeeded ..........
   ......your relatively protected code .....
} else die("Wrong password");

Если вы хотите еще больше безопасности вместо сохранения пароля в виде текста в этом текстовом файле. Sore it hash, а затем, когда вы хотите сравнить его с пользовательским вводом, генерируйте хеш из пользовательского ввода и сравните его с хэшем пароля, который вы загрузили из текстового файла.

sha1($user_input) == $password_from_txt

Ответ 4

Пока ваша установка PHP работает так, как должна, это не менее безопасно, чем любой другой метод. Я бы предпочел имя constant (define) над переменной. Кроме того, вы можете сохранить хэш пароля вместо простого пароля. Это предотвращает кражу ваших паролей, даже если сайт скомпрометирован.

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

Ответ 5

Если сам сайт не скомпрометирован, и теперь так все эти пароли предоставляют доступ (ваша БД, возможно?).

Ответ 6

Это зависит от того, как вы определяете "безопасный".

Вы правы в том, что обычный пользователь этого не увидит.

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

Ответ 7

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

Ответ 8

Я считаю, что в большинстве случаев простой текстовый пароль был бы паролем базы данных, поскольку MySQL, для exmaple, не будет принимать хеш для аутентификации.

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

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

Смотрите этот пост для получения подробной информации и даже небольшой утилиты для Windows, Linux и Mac, что упрощает ее работу.