Токен URL-адреса забытого пароля для PHP MySQL

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

Когда пользователь нажимает ссылку «забыть пароль», он вводит имя пользователя и адрес электронной почты (подтвержденный).

В настоящее время мне трудно отправить им URL-адрес в отправленном электронном письме, чтобы направить их на страницу для сброса.

Любая помощь будет принята с благодарностью (фрагменты кода, учебные пособия, ссылки на методы и т. Д.)

Ta


person Shimsham84    schedule 31.07.2012    source источник
comment
Можете ли вы опубликовать код, который вы используете для этого? Довольно сложно помочь с таким открытым вопросом.   -  person sean    schedule 31.07.2012
comment
Когда вы говорите, что «зашифровали пароль с помощью sha1», я полагаю, вы на самом деле имеете в виду, что вы хешировали пароль. Чтобы помочь эффективно, было бы хорошо, если бы вы могли опубликовать код, который у вас есть в настоящее время, который работает некорректно.   -  person infojolt    schedule 31.07.2012
comment
Как указано в введении к главе руководства PHP, посвященной mysql_* функциям : Это расширение не рекомендуется для написания нового кода. Вместо этого либо mysqli, либо PDO_MySQL. См. Также Обзор API MySQL для получения дополнительной помощи при выборе MySQL API.   -  person eggyal    schedule 31.07.2012


Ответы (1)


  1. Вам не следует даже хранить (несоленые) хэши паролей ваших пользователей: вы должны сначала сгенерировать случайную строку («соль»), объединить ее с их паролем, хешировать результат (используя SHA1 или любой другой алгоритм, который вы предпочитаете) и сохранить как хеш, так и соль в вашей базе данных. Это предотвращает атаки по заранее вычисленному словарю («радужная таблица»), если злоумышленник когда-либо получит доступ к хешам в вашей базе данных.

  2. Сделав это, вы также не должны хранить временный токен для сброса пароля в своей базе данных: если злоумышленник получит доступ к вашей таблице пользователей, ему просто нужно заполнить вашу форму «Я забыл свой пароль» и прочитать токен из базу данных, чтобы затем сбросить пароль этого пользователя, даже не увидев сгенерированного электронного письма. Таким образом, токен известен как «эквивалент пароля» и должен быть защищен точно так же, как и сам пароль: соленый и хешированный.

  3. Сохранив соленый хеш токена сброса, теперь вы можете отправить ссылку своему пользователю с идентификатором пользователя и сбросить токен в строке запроса URL-адреса, например. http://www.example.com/resetpassword.php?user=235747&token=347659864124567532256.

  4. После перехода по этой ссылке предоставленный пользователь и токен будут доступны вашему PHP-скрипту как $_GET['user'] и $_GET['token']; затем вы можете получить соль из базы данных, объединить с предоставленным токеном, вычислить ожидаемый хэш и сравнить с хешем в записи базы данных. Если они совпадают, вы уверены, что пользователь получил электронное письмо, которое вы отправили, и затем можете запросить у него желаемый новый пароль.

person eggyal    schedule 31.07.2012
comment
Спасибо за эту информацию, я предполагаю, что это можно сделать, определив переменную, например, $ salt = sha1 (md5 ($ password)) ;. При исследовании я слышал о радужном столе, но не о методах соли, так что спасибо. - person Shimsham84; 31.07.2012
comment
@ Bailey1990: Нет, соль должна быть случайной: см. stackoverflow.com/a/1551064/623041 - person eggyal; 31.07.2012
comment
+1 за подробный урок по обеспечению безопасности ваших паролей. Хотя мне нужно спросить ... если предположить, что злоумышленник получил доступ к таблице пользователей ... разве он не получит таким образом доступ к соли? И, если, конечно, предположить, что он «знает», какой алгоритм использует страница, разве он не сможет получить доступ таким же образом? - person ATaylor; 01.08.2012
comment
@ATaylor: Имея доступ для чтения к таблице пользователей, злоумышленник действительно обнаружит соль, но это только позволяет ей выполнять атаку грубой силой в автономном режиме для каждого пароля (при наличии достаточно безопасного алгоритма хеширования можно было бы ожидать, что это занять значительное время, даже если злоумышленник имеет значительные вычислительные ресурсы: знание алгоритма не помогает, поскольку, по определению, хеш-функции необратимы). Без соли большая часть этой работы может быть выполнена заранее (и разделена на несколько атак), что значительно сокращает время на взлом каждого пароля. - person eggyal; 01.08.2012
comment
Ах я вижу. Да, я считаю, что нужно помнить, что «совершенно безопасный пароль» невозможен, как и замок, который невозможно взломать, не может существовать ... можно только сделать его настолько чертовски сложным, что злоумышленник должен сдаться. Спасибо за объяснение. - person ATaylor; 01.08.2012
comment
Спасибо за пост, я прочитал довольно много из них, и, кажется, это довольно хорошо освещается. Было бы неплохо, если бы вы показали, какой метод использовать для получения действительно уникальной строки, хотя, поскольку это обсуждается во многих местах, но ничего окончательного я не нашел, сейчас я использую этот uniqid (md5 (mt_rand ()), true ) и будет использовать pHPass для генерации хэша для хранения в БД и будет использовать pHPass с токеном для проверки. - person shaunhusain; 20.10.2013