Можно ли хранить пароль в виде обычного текста в переменной php или в константе php?
Что касается вопроса, безопасно ли хранить пароли на страницах php, таких как
$password = 'pa$$w0rd';
Если пользователи не видят его, это безопасно, верно?
РЕДАКТИРОВАТЬ: Некоторые люди на самом деле предлагали использовать хеш, однако, будет проблема с паролем подключения к серверу базы данных, не так ли?
8 ответов
Краткий ответ - и нет, и это зависит.
Почти никогда не стоит хранить пароли в виде обычного текста, особенно в месте, доступном через Интернет, если по какой-либо другой причине, кроме неправильной настройки сервера или эха в неправильном месте, это может открыть его для всего мира.
Если вы ДОЛЖНЫ хранить пароль (что возможно), вы можете попытаться сохранить его вне webroot, например/var/www/public_html/
Поместите свой код здесь/var/www/includes/
Введите ваши пароли здесь
Еще лучше, если бы система, для которой вам нужен пароль (например, оболочка базы данных), возвращала уже созданный объект. так что вместо того, чтобы просить $databasepassword
вы запрашиваете объект PDO и сохраняете классы своей базы данных вне webroot.
Это зависит от того, какие векторы атаки могут заставить кого-то иметь доступ к этому тексту пароля, и потребует ли он, чтобы он уже находился внутри вашей файловой системы, если это так, то вы, вероятно, все равно испорчены.
Кроме того, если это пароль к содержанию вашего подписчика supa-secrit, то есть, все, что вы потеряли, это некоторые сборы за подписку, если это ваша база данных, у вас могут возникнуть проблемы, если это ваши банковские реквизиты, что хорошо для вас.
Насколько ценна вещь, которую защищает пароль?
В зависимости от того, как вы определяете безопасность, любой подход имеет свои положительные и отрицательные стороны.
Если вы действительно хотите сохранить пароль в своем источнике, возможно, было бы неплохо сделать что-то подобное:
Файл: 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 )
...
Простой текст никогда не бывает хорошей идеей, всегда храните хэш пароля, который хотите сохранить.
Кроме того, попробуйте отделить такие определения от вашего основного исходного файла.
Обычно они этого не видят. Но если на сервере происходит что-то плохое, есть большая вероятность, что сервер вернет ваш php-код в виде обычного текста без его выполнения, и поэтому пользователь увидит весь источник этого файла, а также ваш пароль.
Я бы сохранил пароль где-нибудь, где он не находится в корневом каталоге документа (не может быть открыт в браузере), а затем открыл этот файл с помощью php и прочитал содержимое (пароль). Или, если у вас несколько паролей / пользователей, я бы сохранил их в базе данных для быстрого доступа.
Если вы хотите использовать файловый метод, директория должна выглядеть примерно так (отправлено на сервер)
/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");
Если вы хотите еще большей безопасности, чем хранить пароль в виде текста в этом текстовом файле. Больно, это хэш, а затем, когда вы хотите сравнить его с пользовательским вводом, сгенерируйте хеш из пользовательского ввода и сравните его с хэшем пароля, который вы загрузили из текстового файла.
sha1($user_input) == $password_from_txt
Пока ваша установка PHP работает должным образом, это не менее безопасно, чем любой другой метод. Я бы предпочел именованную константу (определить) над переменной. Кроме того, вы можете хранить хэш пароля вместо простого пароля. Это предотвращает кражу ваших паролей, даже если сайт взломан.
Что касается плохой практики, это зависит. Если вам нужно хранить только один пароль, этот подход вполне подойдет. Хранение их вне корня документа может дать ложное ощущение дополнительной безопасности; корень документа не более абсолютен, чем любая другая настройка сервера.
Я верю, что в большинстве случаев простой текстовый пароль будет паролем базы данных, поскольку MySQL, например, не будет принимать хеш для аутентификации.
Как упоминалось ранее, лучшим решением является сохранение конфигурационного файла PHP с паролем вне webroot.
Если вы беспокоитесь, что кто-то может увидеть ваш пароль во время просмотра файла, вы можете просто сделать его нечитаемым для человека, используя функцию base64.
См. Этот пост для деталей и даже небольшой утилиты для Windows, Linux и Mac, которая делает это проще.
Это зависит от того, как вы определяете "безопасный".
Вы правы в том, что обычный пользователь этого не увидит.
Однако это определенно плохая практика; если ваш сайт будет взломан, к чему еще будут давать доступ эти пароли? Я бы сказал, как минимум, вы должны хранить хэш пароля, а не открытый текст.
Если сам сайт не взломан, и теперь все эти пароли предоставляют доступ (возможно, к вашей БД?).
Иногда это просто необходимо для почтового приложения, где вы можете войти только с простым паролем, а не с хэшем. И если ваше приложение не имеет проблем с безопасностью, это не должно повлиять на вас.