Обновление базы данных mysqli, получающее электронную почту и токен сброса пароля - PullRequest
0 голосов
/ 13 декабря 2018

Я искал и искал.У меня есть несколько запросов на сайте, за исключением двух последних, которые находятся в этом файле.Я просто не могу найти / понять это.Изнурение.

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

Все работает, как и должно, за исключением таблиц, которые не обновляются.Я хочу обновить таблицу idaccount с помощью ipaddress и нового пароля.Я хочу обновить таблицу сброса с помощью ipaddress и «UsedToken» в используемом столбце.(Таким образом, я могу получить двойное использование таблицы. Показывает конкретные данные, если пользователь изменил пароль в своей учетной записи, выполнив вход и запросил электронную почту / токены.) В конечном итоге я хочу создать код, который токен нельзя использовать повторно на основе столбца «используется»не пустой и проверяет, что токен действительно использовался.

Основная HTML-форма для смены пароля:

<body>


<form id="forgotpwdreset" name="forgotpwdreset" method="post" action="" onsubmit="forgotpwdalert()"<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>

<table border="0">
    <tr></tr>
    <tr></tr>

    <input type="hidden" name="email" value="<?php echo $email; ?>" />
    <input type="hidden" name="token" value="<?php echo $token; ?>" />


    Password must be at least 8 characters long and contain at least 1 number AND 1 capital letter.<br /><br />
    <tr>New Password:  <align="center"><input required type="password" name="newpassword" id="newpassword" placeholder="" pattern="(?=.*\d)(?=.*[A-Z]).{8,}">&nbsp;&nbsp;<input type="checkbox" onclick="togglepassword()"> Show Password<br /><br />
    <tr></tr><br />

    <tr>Confirm Password:  <align="center"><input required type="password" name="newpassword2" id="newpassword2" placeholder="" pattern="(?=.*\d)(?=.*[A-Z]).{8,}" onchange="confirmpwd()"><br />
    <tr></tr><br />

    <tr>
    <tr></tr><br />

    <tr><align="center"><input type="submit" name="pwdresetsubmit" id="pwdresetsubmit" value="Reset Password" onclick="return confirmpwd()" />&nbsp;&nbsp;&nbsp
    <tr></tr><br />

    </table>
</form>

</body>

PHP для обработки формы:

    <?php

    include 'insert.php';

    if(isset($_SESSION['ondashsession'])){

    $session = $_SESSION['ondashsession'];

    $sql = "SELECT * FROM ondash_idaccount WHERE ID = '$session'";
    $result = mysqli_query($dbcon, $sql) or die("Error");


while($row = mysqli_fetch_assoc($result)){
     echo "You are already logged in,  " . $row['firstname'] . "." . "<br />";
}
}else{



if (isset($_POST['pwdresetsubmit'])) {

  $newpassword2 = $_POST['newpassword2'];
  $ipaddress = $_SERVER['REMOTE ADDR'];
  // Grab token and email that came from the email link
  $token = $_GET['token'];
  $email = $_GET['email'];

 //echo "Token:  " . $token . "<br />" . "Email:  " . $email; //returns correct info working properly.


 // select email address of user from the password_reset table 

    $sqlnewpass = "SELECT * FROM password_resets WHERE token='$token' AND email='$email'";
    $results = mysqli_query($dbcon, $sqlnewpass);


if (mysqli_num_rows($results) > 0 ){
    $row = mysqli_fetch_assoc($results);

//  print_r($row['email']); //returns correct result
//  print_r("# of rows:  " . $numrows);  //returns correct result

//WORKS UP TO HERE...WORKS UP TO HERE...WORKS UP TO HERE...WORKS UP TO HERE...WORKS UP TO HERE...WORKS UP TO HERE...

    $sql2 = "UPDATE ondash_idaccount SET `password`=?, `ipaddress`=? WHERE `email`='$email'";
    $stmt2 = mysqli_stmt_init($dbcon);

if(!mysqli_stmt_prepare($stmt2, $sql2)){
    echo "SQL error" . $dbcon->error;
}else{

    $hashedpassword = password_hash($newpassword2, PASSWORD_DEFAULT);
    //var_dump($hashedpassword); //generating hash pwd works but not updating database


    mysqli_stmt_bind_param($stmt2, "ss", $hashedpassword, $ipaddress);
    mysqli_stmt_execute($stmt2);
    $stmt2->close();
    error_reporting(E_ALL);
//  echo "SQL 2 error" . $dbcon->error; //No errors reporting

    $UsedToken = 'UsedToken';

    "UPDATE password_resets SET `used`='$UsedToken', `ipaddress`='$ipaddress' WHERE `token`='$token' AND `email`='$email'";


}
}
}

?>

Ни то, ни другоетаблица обновляется.Чего мне не хватает?Любая помощь для этого новичка будет принята.

ОБНОВЛЕНИЕ:

Первый запрос был остановлен из-за опечатки.У меня было $_SERVER['REMOTE ADDR'];.Обратите внимание, что _ отсутствует.Поэтому весь запрос остановлен без ошибок.Поменял на $_SERVER['REMOTE_ADDR']; и вуаля!Находить это было мерзко.По сути, я отображал каждую переменную с некоторым тегом, чтобы узнать, что отображается, и заметил, что ipaddress был пустым!

Второй запрос все еще не был уверен, что происходит.Однако, следуя прекрасному предложению связать параметры (что я должен был сделать независимо от того, чтобы быть уверенным), я переписал код (последний раз!), Чтобы сделать это.Опять вуаля!

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

Обновлен PHP:

<?php

include 'insert.php';

if(isset($_SESSION['ondashsession'])){

$session = $_SESSION['ondashsession'];

$sql = "SELECT * FROM ondash_idaccount WHERE ID = '$session'";
$result = mysqli_query($dbcon, $sql) or die(mysqli_error($dbcon));


while($row = mysqli_fetch_assoc($result)){
     echo "You are already logged in,  " . $row['firstname'] . "." . "<br />";
}
}else{

//Check if token has already been used

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

$sqlused = "SELECT * FROM password_resets WHERE token='$token' AND email='$email'";
$resultsused = mysqli_query($dbcon, $sqlused);


   if (mysqli_num_rows($resultsused) > 0 ){
    $row = mysqli_fetch_assoc($resultsused);
//echo $row['used'];

    if($row['used'] == 'UsedToken'){

        echo "<strong>That reset link has already been used. Please request another.</strong>";

  }else{

if (isset($_POST['pwdresetsubmit'])) {

error_reporting(E_ALL);

  $newpassword2 = $_POST['newpassword2'];
  $ipaddress = $_SERVER['REMOTE_ADDR'];

  // Grab token and email that came from the email link

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

 // select data from password_reset table 

    $sqlnewpass = "SELECT * FROM password_resets WHERE token='$token' AND email='$email'";
    $results = mysqli_query($dbcon, $sqlnewpass);


   if (mysqli_num_rows($results) > 0 ){
    $row = mysqli_fetch_assoc($results);

//update user password in database

    $sql2 = "UPDATE ondash_idaccount SET `password`=?, `ipaddress`=? WHERE `email`='$email'";
    $stmt2 = mysqli_stmt_init($dbcon);

if(!mysqli_stmt_prepare($stmt2, $sql2)){
    echo "SQL error" . $dbcon->error;
}else{

    $hashedpassword = password_hash($newpassword2, PASSWORD_DEFAULT);
    //var_dump($hashedpassword); //generating hash pwd works but not updating database


    mysqli_stmt_bind_param($stmt2, "ss", $hashedpassword, $ipaddress);
    mysqli_stmt_execute($stmt2);
    $stmt2->close();

    echo "<strong>Password successfully reset!</strong>";

//Update pwd reset table

$UsedToken = 'UsedToken';

    $sql3 = "UPDATE password_resets SET `used`=?, `ipaddress`=? WHERE `token`='$token' AND `email`='$email'";
    $stmt3 = mysqli_stmt_init($dbcon);

if(!mysqli_stmt_prepare($stmt3, $sql3)){
    echo "SQL error" . $dbcon->error;
}else{

    mysqli_stmt_bind_param($stmt3, "ss", $UsedToken, $ipaddress);
    mysqli_stmt_execute($stmt3);
    $stmt3->close();
//  echo "SQL 2 error" . $dbcon->error; //No errors reporting
//  echo $row['email'] . $row['ipaddress'];

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

ОБНОВЛЕНИЕ:

Первый запрос был остановлен из-за опечатки.У меня было $_SERVER['REMOTE ADDR'];.Обратите внимание, что _ отсутствует.Поэтому весь запрос остановлен без ошибок.Поменял на $_SERVER['REMOTE_ADDR']; и вуаля!Находить это было мерзко.По сути, я отображал каждую переменную с некоторым тегом, чтобы узнать, что отображается, и заметил, что ipaddress был пустым!

Второй запрос все еще не уверен, что происходит.Однако, следуя прекрасному предложению связать параметры (что я должен был сделать независимо от того, чтобы быть уверенным), я переписал код (последний раз!), Чтобы сделать это.Опять вуаля!

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

Обновлен PHP:

<?php

include 'insert.php';

if(isset($_SESSION['ondashsession'])){

$session = $_SESSION['ondashsession'];

$sql = "SELECT * FROM ondash_idaccount WHERE ID = '$session'";
$result = mysqli_query($dbcon, $sql) or die(mysqli_error($dbcon));


while($row = mysqli_fetch_assoc($result)){
     echo "You are already logged in,  " . $row['firstname'] . "." . "<br />";
}
}else{

//Check if token has already been used

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

$sqlused = "SELECT * FROM password_resets WHERE token='$token' AND email='$email'";
$resultsused = mysqli_query($dbcon, $sqlused);


   if (mysqli_num_rows($resultsused) > 0 ){
    $row = mysqli_fetch_assoc($resultsused);
//echo $row['used'];

    if($row['used'] == 'UsedToken'){

        echo "<strong>That reset link has already been used. Please request another.</strong>";

  }else{

if (isset($_POST['pwdresetsubmit'])) {

error_reporting(E_ALL);

  $newpassword2 = $_POST['newpassword2'];
  $ipaddress = $_SERVER['REMOTE_ADDR'];

  // Grab token and email that came from the email link

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

 // select data from password_reset table 

    $sqlnewpass = "SELECT * FROM password_resets WHERE token='$token' AND email='$email'";
    $results = mysqli_query($dbcon, $sqlnewpass);


   if (mysqli_num_rows($results) > 0 ){
    $row = mysqli_fetch_assoc($results);

//update user password in database

    $sql2 = "UPDATE ondash_idaccount SET `password`=?, `ipaddress`=? WHERE `email`='$email'";
    $stmt2 = mysqli_stmt_init($dbcon);

if(!mysqli_stmt_prepare($stmt2, $sql2)){
    echo "SQL error" . $dbcon->error;
}else{

    $hashedpassword = password_hash($newpassword2, PASSWORD_DEFAULT);
    //var_dump($hashedpassword); //generating hash pwd works but not updating database


    mysqli_stmt_bind_param($stmt2, "ss", $hashedpassword, $ipaddress);
    mysqli_stmt_execute($stmt2);
    $stmt2->close();

    echo "<strong>Password successfully reset!</strong>";

//Update pwd reset table

$UsedToken = 'UsedToken';

    $sql3 = "UPDATE password_resets SET `used`=?, `ipaddress`=? WHERE `token`='$token' AND `email`='$email'";
    $stmt3 = mysqli_stmt_init($dbcon);

if(!mysqli_stmt_prepare($stmt3, $sql3)){
    echo "SQL error" . $dbcon->error;
}else{

    mysqli_stmt_bind_param($stmt3, "ss", $UsedToken, $ipaddress);
    mysqli_stmt_execute($stmt3);
    $stmt3->close();
//  echo "SQL 2 error" . $dbcon->error; //No errors reporting
//  echo $row['email'] . $row['ipaddress'];


}   
}
}
}
}
}
}
}    


?>
0 голосов
/ 13 декабря 2018

Кажется, что в вашем PHP-коде нет явной ошибки.

Я запустил упрощенную версию:

$newpassword2 = "TESTME";
$ipaddress = "127.0.0.1";

$token = "my_token";
$email = "email@email.com";

$sqlnewpass = "SELECT * FROM tmp_password_resets WHERE token='$token' AND 
email='$email'";
$results = mysqli_query($dbcon, $sqlnewpass);


if (mysqli_num_rows($results) > 0 ){
    $row = mysqli_fetch_assoc($results);

    $sql2 = "UPDATE tmp_ondash_idaccount SET `password`=?, `ipaddress`=? WHERE `email`='$email'";
    $stmt2 = mysqli_stmt_init($dbcon);

if(!mysqli_stmt_prepare($stmt2, $sql2)){
    echo "SQL error" . $dbcon->error;
}else{
    $hashedpassword = "MY_HASHED_PASSWORD";

    mysqli_stmt_bind_param($stmt2, "ss", $hashedpassword, $ipaddress);
    mysqli_stmt_execute($stmt2);
    $stmt2->close();

    $UsedToken = 'UsedToken';
}
}

Это успешно запустило ОБНОВЛЕНИЕ.Я бы предложил вам изучить: * Входящие переменные: соответствует ли электронная почта строке в обеих таблицах?Это один и тот же тип данных?Без учета регистра?* Структура таблицы: правильный ли размер и тип полей для входящих строк?

Кроме того, я замечаю, что вы смешиваете процедурный и ООП стиль использования подготовленных операторов mysqli.Рассматривали ли вы использовать разъем PDO вместо согласованности?На том же примечании: есть области, где вы используете bindParam, но не другие (SQL инъекция!).Насколько я понимаю, вы могли бы использовать bindValue для всех этих случаев, независимо от этого.

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