проблемы со скриптом смены пароля на php

#php #mysql

#php #mysql

Вопрос:

У меня есть страница в разделе «Мои участники» на моем веб-сайте, которая позволяет пользователям менять свой пароль. Все это функционирует корректно, если все данные введены правильно.

Форма запрашивает имя пользователя, текущий пароль, новый пароль, подтверждает новый пароль.

Если пользователь вводит неправильное имя пользователя, форма не меняет его пароль (как ожидалось), а направляет его на страницу подтверждения вместо страницы ошибки.

Кроме того, если пользователь вводит неправильный пароль, форма все равно меняет его пароль и направляет их на страницу подтверждения, вместо ТОГО, чтобы НЕ менять пароль и направлять их на страницу ошибки.

Мой код вставлен ниже, если кто-нибудь может помочь, я был бы очень признателен! Спасибо!

Mel

php для формы смены пароля:

  <?php 

session_start();

$host="localhost"; // Host name 

$username="username"; // Mysql username 

$password="password"; // Mysql password 

$db_name="database"; // Database name 

$tbl_name="table"; // Table name 

// Connect to server and select databse.

mysql_connect("$host", "$username", "$password")or die("cannot connect"); 

mysql_select_db("$db_name")or die("cannot select DB");



$username = $_POST['username'];

$password = $_POST['password'];

$newpassword = $_POST['newpassword'];

$repeatnewpassword = $_POST['repeatnewpassword'];


$result = mysql_query("SELECT password FROM $tbl_name WHERE username='$username'");

if(!$result) 
{ 
    header("location:error1.php"); 
} 

if ($row = mysql_fetch_assoc($result))
{ 
     header("location:error.php"); 
} 

if($newpassword==$repeatnewpassword) 

    $sql=mysql_query("UPDATE $tbl_name SET password='$newpassword' where username='$username'"); 

if($sql) 
{ 
        header("location:success.php");
}
else
{ 
   header("location:error3.php");
}  

?> 
  

Комментарии:

1. SQL может быть введен в ваш запрос. Даже если вы новичок, обязательно ознакомьтесь с советами по безопасности для PHP-кода, особенно для SQL-инъекций.

Ответ №1:

Вашему sql должно понравиться это:

 $result = mysql_query("SELECT password FROM $tbl_name WHERE username='$username' AND password = '$password'");
  

Комментарии:

1. Я собирался сказать это. В настоящее время нет проверки, был ли старый пароль правильным, ни в SQL, ни в PHP. И если старый пароль был неправильным, действительно существует огромная вероятность того, что пользователь не тот, за кого себя выдает.

Ответ №2:

Ваша проблема заключается здесь —

 if(!$result)
  

Когда пользователь вводит неправильное имя пользователя, запрос выполняет поиск этого пользователя в базе данных, но не находит его. Таким образом, результат будет содержать пустой набор данных, но запрос все еще действителен, поскольку вы можете запросить базу данных и вернуть пустые наборы данных. Таким образом, ваша !$result проверка всегда будет оцениваться как true, если не возникнет ошибка DB.

Вместо того, чтобы просто проверять $result, вы должны сделать следующее —

 if($newpassword==$repeatnewpassword) 
{
    // User's provided new password and repeatpassword matches, so keep going forward,
    // query the database.

    $result = mysql_query("SELECT password FROM $tbl_name WHERE username='$username'");

    if($result)
    {
        // Database query successful. Now check if that username exists in the database.
        if(mysql_num_rows($result) <= 0)
        {
            // user has provided wrong username, take action accordingly
        }
        else
        {
            // Username found, now check for old password match
            $row = mysql_fetch_array($result);

            if($password==$row['password'])
            {
                // User's old password matches with DB. So, update password and
                // forward him to confirmation page
            }
            else
            {
                // User's old password doesn't match with db. Show appropriate message
            }
        }
    }
    else
    {
        // Some DB error occurred. Handle it appropriately.
    }
}
else
{
    // User's new and repeat password don't match, so take action accordingly
}
  

P.S.

Ваш сайт уязвим для атаки с использованием SQL-инъекций. Вы должны, по крайней мере, очистить свой ввод следующим образом —

 $username = mysql_real_escape_string($_POST['username']);

$password = mysql_real_escape_string($_POST['password']);

$newpassword = mysql_real_escape_string($_POST['newpassword']);

$repeatnewpassword = mysql_real_escape_string($_POST['repeatnewpassword']);
  

Чтобы узнать больше, перейдите сюда: руководство по mysql_real_escape_string().

Также хранение паролей в базе данных в обычном старом текстовом формате — еще одна плохая идея. Даже вы не должны иметь возможности видеть пароли, которые предоставляет пользователь вашего сайта. Используйте функцию md5() для шифрования паролей и последующего сохранения их в базе данных.

Комментарии:

1. Извините, я абсолютный новичок, когда дело доходит до php. изо всех сил пытаюсь даже обновить свой php-файл с вашими изменениями! :-/

2. @Новичок: Продолжайте пытаться, вы сможете легко разобраться в этом :-).

3. Я знаю, что я заноза, но есть ли шанс, что вы могли бы показать мне, как должен выглядеть полный код?

4. @Новичок: Вероятно, вы неправильно использовали if-else. Если вы скопировали и вставили приведенный выше код, то вам не следует этого делать. Мой приведенный выше ответ просто для того, чтобы показать вам, как вы можете решить свою проблему, вы должны перевести его для собственного использования.

5. Ура, получилось! Миллион благодарностей! Теперь, чтобы разобраться с зашифрованными паролями

Ответ №3:

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

$sql = "SELECT * FROM $tbl_name WHERE ".
       "username='$username' AND password = '$password' LIMIT 1";


$result = mysql_query($sql);

$numrow = mysql_num_rows($result);

if($numrows != 1){ /**go to error page**/ }

}
  

Ответ №4:

это

 $result = mysql_query("SELECT password FROM $tbl_name WHERE username='$username'");
  

и это

  if ($row = mysql_fetch_assoc($result))
{ 
     header("location:error.php"); 
} 
  

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

измените на

 $result = mysql_query("SELECT password FROM $tbl_name WHERE username='$username' AND password = '$password'");
  

Ответ №5:

Я отредактировал ваш код более упрощенным способом.

Вы должны попробовать это ::

 <?php 

session_start();

$host="localhost"; // Host name 

$username="username"; // Mysql username 

$password="password"; // Mysql password 

$db_name="database"; // Database name 

$tbl_name="table"; // Table name 

// Connect to server and select databse.

mysql_connect("$host", "$username", "$password")or die("cannot connect"); 

mysql_select_db("$db_name")or die("cannot select DB");



$username = $_POST['username'];

$password = $_POST['password'];

$newpassword = $_POST['newpassword'];

$repeatnewpassword = $_POST['repeatnewpassword'];


$result = mysql_query("SELECT password FROM $tbl_name WHERE username='$username' and password = '$password'");

if(!$result) 
{ 
    header("location:error1.php"); 
} 

if(mysql_num_rows($result)){
    if($newpassword==$repeatnewpassword){
        $sql=mysql_query("UPDATE $tbl_name SET password='$newpassword' where username='$username'");        
        if($sql) 
        { 
                header("location:success.php");
        }
        else
        {
            // In case when problem while updating your new password
           header("location:error3.php");
        }       
    } else {
        // In case when new-password and retype-password do not match
        header("location:error_password_not_matched.php");
    }
} else {
    // In case of you have not correct User name and password
    header("location:error.php"); 
}

?>