Можно ли хранить пароль в виде обычного текста в переменной php или в константе php? - PullRequest
29 голосов
/ 20 февраля 2009

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

$password = 'pa$$w0rd';

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

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

Ответы [ 8 ]

34 голосов
/ 20 февраля 2009

Краткий ответ: нет, и он зависит.

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

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

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

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

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

Насколько ценна вещь, которую защищает пароль?

9 голосов
/ 20 февраля 2009

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

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

Файл: 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 )
...

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

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

7 голосов
/ 20 февраля 2009

Обычно они этого не видят. Но если на сервере происходит что-то плохое, есть большая вероятность, что сервер вернет ваш 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
2 голосов
/ 20 февраля 2009

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

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

0 голосов
/ 12 мая 2009

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

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

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

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

0 голосов
/ 20 февраля 2009

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

0 голосов
/ 20 февраля 2009

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

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

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

0 голосов
/ 20 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...