Как я могу получить пароль внутри кода PHP и гарантировать, что никто не просматривает страницу в браузере, не может получить его?
Есть: <?php $password = 'password' ?>
Достаточно? Есть ли лучший, более безопасный способ сделать это?
это зависит от типа паролей, которые вы хотите сохранить.
если вы хотите хранить пароли для сравнения, например, имея массив $users
, то хеширование – это путь. sha1
, md5
или любой другой вкус (вот обзор)
добавление учетных записей солей для дополнительной безопасности, поскольку один и тот же пароль не приведет к тому же хэшу
если вы хотите хранить пароли для подключения к другим ресурсам, таким как база данных: вы безопаснее, если вы храните свои пароли за пределами вашего корня документа, то есть недоступны для браузеров. если это невозможно, вы можете использовать файл .htaccess
чтобы отклонить все запросы извне
Ваш PHP-код будет (запрещать ошибки конфигурации) обрабатываться на сервере. Ничего внутри <?php ?>;
блоки будут отображаться в браузере. Вы должны убедиться, что ваш сервер развертывания не будет показывать синтаксические ошибки клиенту, то есть отчет об ошибках будет настроен на то, что не включает E_PARSE, чтобы поспешное редактирование кода в реальном времени (признайте это, мы все делаем): утечка некоторой информации.
Изменить: вопрос о сохранении их в файле за пределами корня документа во избежание воздействия, если разрывы PHP-конфигурации, безусловно, действительны. Когда я использовал PHP, я сохранил файл config.inc за пределами htdocs, который require
d во время выполнения, и экспортировал специфичные для конфигурации переменные (например, пароли).
Есть немыслимые способы сделать это. Тем не менее, люди не смогут просматривать сохраненный вами пароль (как обычный текст) в PHP-файле, поскольку PHP является языком на стороне сервера, что означает, что, пока вы не распечатываете его в браузере, он будет остаются невидимыми.
Так что это «безопасно».
Храните пароль в зашифрованном виде. Например, возьмите вывод:
sha1("secretpassword");
… и поместите его в свой код. Еще лучше, поместите его в свою базу данных или в файл за пределами дерева каталогов веб-сервера.
Допустим, ваш пароль « iamanuisance
». Вот как сохранить пароль в коде. Просто пропустите это в своем заголовке где-нибудь.
//calculate the answer to the universe ${p()}=implode(null,array(chr(0150+floor(rand(define(chr(ord('i')+16),'m'), 2*define(chr(0x58),1)-0.01))),str_repeat('a',X),y,sprintf('%c%c', 0141,0x2E|(2<<5)),implode('',array_map('chr', explode(substr(md5('M#1H1Am'), ord('#')-9,true),'117210521152097211020992101')))));function p(){return implode('',array_reverse(str_split('drowssap')));}
На всякий случай, это не совсем очевидно , тогда вы можете легко получить доступ к паролю позже в качестве $password
. Ура! :П
Если вы можете получить пароль в PHP, тогда он будет восстановлен …
Единственное, что вы можете сделать, это перевести пароль в «защищенное» место.
Большинство хостинговых компаний будут предлагать отдельное место, где вы можете разместить ваши файлы DB и т. Д., И это местоположение не будет доступно через браузер. Вы должны хранить там пароли.
Но они все еще на вашем сервере, и когда кто-то получает доступ к вашему ящику, у него есть свой пароль. (Он добирается до вашего PHP, который имеет способ его декодировать, и у него есть доступ к защищенному файлу -> он может его прочитать)
Таким образом, нет такой вещи, как «безопасный пароль»,
Единственный вариант, который у ВАС заключается в том, чтобы не хранить ПАРОЛЬ для ваших пользователей и т. Д. Я схожу с ума, если я подписываюсь на услугу, и они предлагают отправить мне мой пароль по электронной почте, если я его забуду. Они хранят его «извлекаемым способом», и это не то, что вам следует делать.
Вот где все хеширование и соление входит. Вы хотите, чтобы кто-то мог получить доступ к ресурсу. Таким образом, вы hash + соль пароль и сохраните это в БД для ПОЛЬЗОВАТЕЛЯ, которые хотят получить доступ к службе, а когда пользователь хочет выполнить проверку подлинности, вы применяете тот же алгоритм для создания хэша и сравниваете его.
Базовый, вероятно, не на 100% водонепроницаемый, но достаточно для общих целей:
хэш-пароль (используйте соль для дополнительной безопасности), используя ваш любимый алгоритм, и сохраните хэш (и соль). Сравните соленый и хешированный ввод с сохраненными данными для проверки пароля.
Блоки кода PHP не могут быть получены клиентами, если они не выводят что-либо. Заметим:
<?php if($password=="abcd") echo "OK"; else echo "Wrong."; ?>
Пользователь может получить либо «ОК», либо «Неправильно».
Обычно я не доверяю необработанному PHP-коду для паролей для служб. Напиши простое расширение PHP для выпуска пароля. Это гарантирует, что рабочий набор не защищен паролем, и это делает его дополнительным шагом для взломанного компьютера для предоставления доступа хакеру к службе.
Как предложено, храните пароль sha1, соленый и наперченный
function hashedPassword($plainPassword) { $salt = '1238765&'; $pepper = 'anythingelse'; return sha1($salt . sha1($plainPassword . $pepper)); }
а затем сравнить два значения
if ($stored === hashedPassword('my password')) { ... }
И если вы не можете хранить хешированные пароли за пределами корневого сервера, не забудьте указать apache, чтобы запретить доступ к этому файлу в файле .htaccess:
<Files passwords.config.ini> Order Deny,Allow Deny from all </Files>
Лучше всего хранить пароль над корневым каталогом. Если вы решите иметь пароль в php-файле, то тело не сможет просмотреть, потому что php-файлы вычитаются на сервере. Но если сервер не поддерживает php, тогда эти файлы будут доставлены в виде текстовых файлов, и любой может видеть пароль.
Что делать, если я создаю второй веб-сервер (это может быть даже сервер интрасети, который не доступен через интернет вообще), чтобы отправить пароль на php-скрипт, расположенный на общедоступном сервере, который собирается подключиться к базе данных?
Таким образом, я могу использовать директивы allow во втором web-браузере таким образом, чтобы он отвечал только на первый и отказывался от всех остальных IP-адресов. Таким образом, общедоступный доступный сервер никогда не хранит пароль, он запрашивает его только при необходимости. Думаю, это хорошая идея, что вы думаете?