2013-12-24 4 views
0

У меня есть две таблицы с именем «members» и «password_reset». У меня есть форма (request-password.php), где пользователи могут сбросить свой пароль, заполнив их электронную почту. Когда они заполняют форму, ссылка на токен отправляется на адрес электронной почты пользователя. Токены хранятся в таблице «password_reset», а все пользователи в таблице «члены»Проверить действительный токен, чтобы обновить пароль

Когда пользователь нажимает на ссылку в письме, он будет перенаправлен на страницу reset-password.php, где он чтобы ввести новый пароль и подтвердить его, заполнив его снова. После нажатия кнопки «Отправить» страница будет перенаправлена ​​на update-password.php. Это страница с кодом для обновления нового пароля в базе данных. Однако, прежде чем страница сможет обновить базу данных, она должна проверить, введен ли пользователь пароль, который равен подтвердителю. Также верно ли письмо и назначенный токен. Если введенные пароли равны, а токен - excist, он должен обновить запись пользователя этого конкретного пользователя.

Мои вопросы: Как получить файл update-password.php, чтобы проверить, действительно ли электронная почта и назначенный токен действительны, так что пользовательский указатель пользователя с этим письмом может быть обновлен? Электронная почта хранится в таблице 'members' и токене в 'password_reset'. Я понятия не имею, как их связать.

Это мой сброс-password.php файл

if (isset($_GET['token'])) { 
$uniqid = htmlentities($_GET['token']); 
$result = mysqli_query($mysqli,"SELECT * FROM password_reset WHERE token = '".$uniqid."' "); 
if (mysqli_num_rows($result) > 0) { 
    $row = mysqli_fetch_array($result); 

//Check Geldigheid token 
$geldig = 7200; 
if (time()- intval($row['tstamp']) > $geldig) { 
//TOKEN HAS EXPIRED AND SUBMIT BUTTON HAS BEEN DISABLED 
echo " 
<!DOCTYPE html> 
<html> 
    <head> 
     <title>Wachtwoord Resetten</title> 
     <link rel='stylesheet' href='../../css/reset-wachtwoord.css' /> 
     <script type='text/JavaScript' src='../../js/sha512.js'></script> 
     <script type='text/JavaScript' src='../../js/forms.js'></script> 
    </head> 
    <body> 
    <div id='container'> 
    <div class='logo'></div> 
    <div class='ww-vergeten-form'> 
     <form action='' method=''> 
     <input type='password' name='password' id='password' placeholder='Nieuw Wachtwoord' size='50' maxlength='0'> 
     <input type='password' name='confirmpwd' id='password' placeholder='Herhaal Wachtwoord' size='50' maxlength='0'> 
     <input type='submit' class='reset-btn disabled' name='' value='Reset Wachtwoord' disabled></p> 
     </form> 
     <p class='error'>Sessie Verlopen. <a href='index.php'>Vraag een nieuwe aan</a>.</p> 
    </div> 
    </div> 
    </body> 
</html> 
"; 
} else { 
//TOKEN IS STILL VALID 
echo " 
<!DOCTYPE html> 
<html> 
    <head> 
     <title>Wachtwoord Resetten</title> 
     <link rel='stylesheet' href='../../css/reset-wachtwoord.css' /> 
     <script type='text/JavaScript' src='../../js/sha512.js'></script> 
     <script type='text/JavaScript' src='../../js/forms.js'></script> 
    </head> 
    <body> 
    <div id='container'> 
    <div class='logo'></div> 
    <div class='ww-vergeten-form'> 
     <form action='password-changed.php' method='post'> 
     <input type='password' name='password' id='password' placeholder='Nieuw Wachtwoord' size='50' maxlength='255'> 
     <input type='password' name='confirmpwd' id='password' placeholder='Herhaal Wachtwoord' size='50' maxlength='255'> 
     <input type='submit' class='reset-btn' name='update' value='Reset Wachtwoord'></p> 
     </form> 
     <p class='nieuw-account'>Nog geen account? <a href='../../'>Maak er een aan</a>!</p> 
    </div> 
    </div> 
    </body> 
</html> 
"; 
} 

}else{ 
echo "<p class='error'>Token incorrect</p>"; 
} 
} 

UPDATEEEEEEEEEEE! * @Chancho * - Хорошо, я обновил свой URL в посыле-email.php на:

$url = "DOMAIN.COM/reset-password/reset.php?email=".$email."#token=".$uniqid; 

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

Нечто подобное ?:

if (isset($_GET['token'])) { 
$uniqid = htmlentities($_GET['token']); 
$email = htmlentities($_GET['email']); 
$result = mysqli_query($mysqli,"SELECT * FROM password_reset WHERE token = '".$uniqid."' "); 
$result2 = mysqli_query($mysqli,"SELECT * FROM members WHERE email = '".$email."' "); 
if (mysqli_num_rows($result) > 0) { 
    $row = mysqli_fetch_array($result,$result2); 
} 
} 
+2

Покажите нам, что у вас есть для update-password.php, это действительно то, что нужно сделать. –

+0

* «Я не могу заставить последнюю часть работать» * - И это 'part' нам нужно увидеть' update-password.php', ваша форма рядом с избыточным. '$ part =" update-password.php ";' –

+0

Единственное, что я могу найти до сих пор, это то, что я думаю, что ваш токен может быть интерпретирован как строка вместо целого, что может быть или не быть желаемым результатом , Дайте этому try 'token = '$ uniqid'' вместо' token =' ". $ Uniqid." 'Также попробуйте закрыть это с помощью полуколонии 'value =' '' –

ответ

0

Вы могли бы сделать releation между ADRES электронной почты и маркера ID:

  1. recieves маркера пользователя в его/ее почтовый ящик
  2. пользователь следует ссылке и вводит адрес электронной почты на веб-страницу

reset-password.php (непроверенный код):

$token = $_GET['token']; 
$email = $_GET['email']; 

//Don't forget to escape your query parameters 
$token = $mysqli->real_escape_string($token); 
$email = $mysqli->real_escape_string($email); 

$result = mysqli_query($mysqli->query("SELECT * FROM password_reset WHERE token = '$token' AND email = '$email'")); 

if(mysqli_num_rows($result) > 0) 
{ 
    //user verified, update usertable 
} 
else 
{ 
    //token or email invalid, show error to user 
} 
+0

Спасибо за ответ. Что касается вашего второго пункта, я не хочу, чтобы пользователь заполнял его/ее электронную почту во второй раз. Я имею в виду, что он уже ввел электронное письмо, которое заставило ее получить электронное письмо с токеном. Пользователь должен быть проверен к тому моменту. О чем я думал, заключается в следующем: добавление $ email в форму, в которой он хранит токен в таблице «password_reset». Таким образом, в основном будет храниться электронная почта пользователей. ОДНАКО, когда пользователь зарегистрировался, его электронная почта была вставлена ​​в таблицу «members». Так что dunno, если это решение .. – user3131209

+0

Тогда вы можете просто отправить адрес электронной почты по ссылке для reset-password.php и получить его с помощью '$ _GET ['email']' – Chancho

+0

Я, вероятно, думаю, что это лучшее, что можно сделать , Таким образом, ссылка будет выглядеть так: www.domain.com/reset?token=TOKENHEREemail=EMAILHERE. Затем я могу проверить, равен ли токен электронной почте. Ему все равно, что токен хранится в другой таблице, кроме электронной почты, верно? – user3131209

Смежные вопросы