Как безопасно хранить пароль внутри кода PHP? - PullRequest
8 голосов
/ 16 сентября 2009

Как я могу иметь пароль внутри кода PHP и гарантировать, что никто, просматривающий страницу в браузере, не сможет его восстановить?

Достаточно ли: <?php $password = 'password' ?>? Есть ли лучший, более безопасный способ сделать это?

Ответы [ 11 ]

12 голосов
/ 16 сентября 2009

зависит от типа паролей, которые вы хотите сохранить.

  • , если вы хотите сохранить пароли для сравнения, например, имея массив $users, то хэширование - путь. sha1, md5 или любой другой аромат (вот обзор)

    добавление соли обеспечивает дополнительную безопасность, поскольку тот же пароль не приведет к тому же хешу

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

6 голосов
/ 16 сентября 2009

Ваш PHP-код (исключая ошибки конфигурации) будет обработан на сервере. Ничто внутри блоков <?php ?>; не будет видно в браузере. Вы должны убедиться, что ваш сервер развертывания не будет показывать синтаксические ошибки клиенту - т. Е. В отчете об ошибках задано что-то, кроме E_PARSE, чтобы не было поспешного редактирования живого кода (допустим, мы все это делаем :) утечка некоторой информации.

Редактировать: пункт о том, чтобы хранить их в файле вне корня документа, чтобы избежать разоблачения, если ваши разрывы конфигурации PHP, безусловно, действительны. Когда я использовал PHP, я сохранял файл config.inc вне htdocs, который был require d во время выполнения, и экспортировал переменные, специфичные для конфигурации (то есть пароли).

2 голосов
/ 16 сентября 2009

Допустим, ваш пароль "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. Ура! : P

2 голосов
/ 16 сентября 2009

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

Так что это "безопасно".

1 голос
/ 16 сентября 2009

Если вы можете восстановить пароль в PHP, то его можно восстановить ...

Единственное, что вы можете сделать, - это переместить ваш пароль в «защищенное» место.

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

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

Так что не существует такого понятия, как «безопасный пароль»

Единственный вариант, которым вы располагаете, - это НЕ ХРАНИТЬ ПАРОЛИ для ваших пользователей и т. Д. ... Я разозлился, если подписался на услугу, и они предлагают прислать мне мой пароль по электронной почте на случай, если я его забуду. Они хранят его «извлекаемым способом», и это не то, что вы должны делать.

Вот где все хеширование и засолка приходят. Вы хотите убедиться, что кто-то может получить доступ к ресурсу. Таким образом, вы хэшируете + солите пароль и сохраняете его в БД для ПОЛЬЗОВАТЕЛЯ, который хочет получить доступ к сервису, и когда пользователь хочет аутентифицировать, вы применяете тот же алгоритм для создания хэша и его сравнения.

1 голос
/ 16 сентября 2009

Основной, вероятно, не на 100% водонепроницаемый, но достаточно для общих целей:

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

1 голос
/ 16 сентября 2009

Храните пароль в зашифрованном виде. Например, возьмите вывод:

sha1("secretpassword");

... и вставьте это в свой код. Более того, поместите его в свою базу данных или в файл за пределами дерева каталогов веб-сервера.

0 голосов
/ 02 декабря 2011

Как и предполагалось, храните пароль 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>
0 голосов
/ 20 сентября 2009

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

0 голосов
/ 16 сентября 2009

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

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