paradox
3 سال پیش توسط paradox مطرح شد
22 پاسخ

عوض کردن پسورد در php

سلام دوستان من با کد زیر پسورد دیتابیس عوض میکنم ولی یه مشکلی هست که هر پسوردی تو input پسورد قدیمی قرار بدم در هر صورت پسورد عوض میشه نمیدونم چه شرطی بزارم که پسورد قدیمی رو از دیتابیس بخونه و اجازه نده هر پسوردی به جای پسورد قدیمی قرار بدیم
لطفا دوستان راهنمایی کنید

<?php
require_once '../config/config.php';
?>
   <div class="row">
        <div class="col-lg-12">
            <section class="panel">
                <header class="panel-heading">
                    لیست اعضا

                </header>
                <table class="table table-striped border-top" id="sample_1">
                    <thead>
                        <tr>
                            <th>#</th>
                            <th>پسورد</th>
                            <th>عملیات</th>
                        </tr>
                    </thead>
                    <tbody>

                        <?php
                        $query = mysqli_query($db, "SELECT * FROM users ORDER BY id desc");
                        while ($row = mysqli_fetch_assoc($query)) {

                        ?>
                            <tr>
                                <th><?php echo $row["id"]; ?></th>
                                <th><?php echo $row["password"]; ?></th>
                                <td>
                                    <a href="index.php?edit=<?php echo $row['id']; ?>" class="btn btn-success">ویرایش</a>
                                </td>
                            </tr>

                        <?php } ?>

                    </tbody>

                </table>
            </section>
        </div>
    </div>
    <?php

    if (isset($_GET['edit'])) {
        $id = $_GET['edit'];
        $query = mysqli_query($db, "SELECT * FROM  users WHERE id= $id");

    $userInfo = mysqli_fetch_assoc($query);

    ?>
              <div class="row">
                <div class="col-lg-12">
                    <section class="panel">
                        <header class="panel-heading">
                        عملیات تغییر رمز

                        </header>
                        <div class="panel-body">
                            <form role="form" method="post" action="index.php">

            <input type="hidden" name="id" value="<?php echo $userInfo['id']; ?>">
                                <div class="form-group">
                                    <label for="exampleInputEmail1">رمز قدیمی:</label>
                                    <input type="password" class="form-control" id="exampleInputEmail1" placeholder="رمز قدیمی را وارد نمایید" name="password">
                                </div>
                                <div class="form-group">
                                    <label for="exampleInputPassword1">رمز جدید:</label>
                                    <input type="password" class="form-control" id="exampleInputPassword1" placeholder="رمز جدید را وارد نمایید" name="new-password">
                                </div>
                                <div class="form-group">
                                    <label for="exampleInputPassword1">تکرار رمز جدید:</label>
                                    <input type="password" class="form-control" id="exampleInputPassword1" placeholder="تکرار رمز جدید را وارد نمایید" name="password-conf">
                                </div>

                                <button type="submit" class="btn btn-info" name="sabt">ثبت</button>
                            </form>

                        </div>
                    </section>
                </div>
              </div>

    <?php    }   ?>

<?php

if(isset($_POST['sabt'])) {
    $id = $_POST['id'];
    $password = md5($_POST['password']);
    $newPassword = md5($_POST['new-password']);
    $passwordConf = md5($_POST['password-conf']);

    $check =  mysqli_query($db , "SELECT * FROM users WHERE id = $id");

    if ($newPassword !== $passwordConf)
    {
        echo '<div class="alert alert-danger ">پسورد و تکرار پسورد با هم برابر نیست.</div>' ;

    } 
    else {

        $editUser = mysqli_query($db , "UPDATE users SET password ='$newPassword'  WHERE id=$id ");

        if($editUser){
        header("Location:index.php");

        }
    }
}

?>

ثبت پرسش جدید
Reza
تخصص : برنامه نویس وب
@Rezanp7 3 سال پیش مطرح شد
0
if(isset($_POST['register-button'])){
$name = $_POST['names'];
$national = $_POST['national'];
$age = $_POST['age'];
$password = password_hash($_POST['pass'], PASSWORD_DEFAULT);
$repass = $_POST['repass']
$email = $_POST['email'];
$gender = $_POST['gender'];

if (password_verify($repass, $password)) {
echo 'Password is valid!';
}
else
{
mysqli_query( $db , "INSERT INTO users( name , age , gender , national , email , password ) VALUES ( '$name' , '$age' , '$gender' , '$national'  , '$email' , '$password' )");

echo "ثبت نام با موفقیت انجام شد";
}

}

این روش دوم هست دقیقا همون کد شماست فقط نباید repass هش بشه و اینکه ارگومان دوم تابع password_verify باید پسورد هش شده باشه

اما برای لاگین شما توی دیتابیس یه پسورد هش شده دارید درسته؟
با استفاده از تابع password_verify ارگومان اول پسوردی که از user input میگیرید و ارگومان دوم پسورد هش شده که از دیتابیس select میکنید اینارو مثل بالا توی if انجام میدید اگه درست بود کاربر لاگین میشه در غیر این صورت ارور نمایش میدین


فرشید مرادی
تخصص : noob
@eniack 3 سال پیش مطرح شد
0

@wxyz4367
سلام برای هش کردن از PASSWORD_BCRYPT استفاده کنید هم مطمعن تره و هم با فانکشن password_verify پسورد جدید و قبلیو چک میکنه


paradox
@wxyz4367 3 سال پیش مطرح شد
0

@eniack
ممنون از شما
به چه صورت باید تعریف کنم ؟
به این صورت که اشتباهه

      $password = password_hash($_POST['pass']);

فرشید مرادی
تخصص : noob
@eniack 3 سال پیش مطرح شد
0

@wxyz4367
به این صورت استفاده میشه

$pass=
password_hash($_POST['pass'], PASSWORD_DEFAULT);

paradox
@wxyz4367 3 سال پیش مطرح شد
0

@eniack
برای ثبت نام اومدم پسورد هش قرار دادم
به این صورت نوشتم فقط ارور اول نمایش میده و ثبت نام انجام نمیشه اشکالی تو کد هست ؟


    if(isset($_POST['register-button'])){
      $name = $_POST['names'];
      $national = $_POST['national'];
      $age = $_POST['age'];
      $password = password_hash($_POST['pass'], PASSWORD_DEFAULT);
      $repass = password_hash($_POST['repass'], PASSWORD_DEFAULT);
      $email = $_POST['email'];
      $gender = $_POST['gender'];

      if($password != $repass)
      {
        echo "password does not match with repass";
      }
      else
      {
        mysqli_query( $db , "INSERT INTO users( name , age , gender , national , email , password ) VALUES ( '$name' , '$age' , '$gender' , '$national'  , '$email' , '$password' )");

        echo "ثبت نام با موفقیت انجام شد";
      }

    }

Reza
تخصص : برنامه نویس وب
@Rezanp7 3 سال پیش مطرح شد
0

باید با تابع password_verify صحت پسورد چک بشه


paradox
@wxyz4367 3 سال پیش مطرح شد
0

@Rezanp7
قبل از صحت پسورد میخام ثبت نام انجام بدم با پسورد هش
ولی ثبت نام انجام نمیشه و متن شرط اول نمایش میده که پسورد و تکرار پسورد یکی نیست

نمیدونم اشکال کد کجاست


    if(isset($_POST['register-button'])){
      $name = $_POST['names'];
      $national = $_POST['national'];
      $age = $_POST['age'];
      $password = password_hash($_POST['pass'], PASSWORD_DEFAULT);
      $repass = password_hash($_POST['repass'], PASSWORD_DEFAULT);
      $email = $_POST['email'];
      $gender = $_POST['gender'];

      if($password != $repass)
      {
        echo "password does not match with repass";
      }
      else
      {
        mysqli_query( $db , "INSERT INTO users( name , age , gender , national , email , password ) VALUES ( '$name' , '$age' , '$gender' , '$national'  , '$email' , '$password' )");

        echo "ثبت نام با موفقیت انجام شد";
      }

    }

Reza
تخصص : برنامه نویس وب
@Rezanp7 3 سال پیش مطرح شد
0

@wxyz4367
تکرار پسورد نباید هش بشه
بعدشم با عملگر == نمیتونید چک کنید که پسورد باهم مطابقت داره یا نه باید با تابع password_verify انجام بدید


فرشید مرادی
تخصص : noob
@eniack 3 سال پیش مطرح شد
0

@wxyz4367
سلام ، اینو تست کنید
یعنی قرار بدید جای if که پسورد رو چک میکنه

if (password_verify($password, $repass)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

Reza
تخصص : برنامه نویس وب
@Rezanp7 3 سال پیش آپدیت شد
0

دوتا روش وجود داره برای اینکار که من روش ساده ترش رو میگم بهت الان

if(isset($_POST['register-button'])){
      $name = $_POST['names'];
      $national = $_POST['national'];
      $age = $_POST['age'];
      $password = $_POST['pass'];
      $repass = $_POST['repass'];
      $email = $_POST['email'];
      $gender = $_POST['gender'];

      if($password != $repass)
      {
        echo "password does not match with repass";
      }
      else
      {
    $password = password_hash($password , PASSWORD_DEFAULT)
        mysqli_query( $db , "INSERT INTO users( name , age , gender , national , email , password ) VALUES ( '$name' , '$age' , '$gender' , '$national'  , '$email' , '$password' )");

        echo "ثبت نام با موفقیت انجام شد";
      }

    }

این کد اول میاد پسورد هارو چک میکنه و اگه برابر بودن پسورد رو هش میکنه و توی دیتابیس ذخیره میکنه
راه دیگه هم راهی هست که دوستمون
@eniack
بهش اشاره کرده


فرشید مرادی
تخصص : noob
@eniack 3 سال پیش مطرح شد
0

@Rezanp7
پسورد باید اول هش بشه بعد چک بشه اینطوری از لحاظ امنیتی حفظ میشه


Reza
تخصص : برنامه نویس وب
@Rezanp7 3 سال پیش مطرح شد
0

@eniack
مهم اینه پسوردی که توی دیتابیس ذخیره میشه هش شده باشه تا در صورت لو رفتن دیتا بیس نشه پسورد کاربر رو خوند
وگرنه فکر نکنم برای چک کردن موردی داشته باشه


فرشید مرادی
تخصص : noob
@eniack 3 سال پیش مطرح شد
0

@Rezanp7
این روش به هیچ عنوان تایید شده نیست ، حتی php واسه این کار خودش تابع گذاشته یعنی ذهنیت اینه که پسورد سمت بکند میاد باید هش شده باشه


Reza
تخصص : برنامه نویس وب
@Rezanp7 3 سال پیش مطرح شد
0

@eniack
ما فقط اول دوتا استرینگ رو چک میکنیم و ریکوئستی هم نمیفرستیم یه جایی که بخواد خطرناک باشه یا نه
اگه پسورد ها درست بود اونقت هش میشه و ریکوئست به سمت بک اند میره

در کل منطقی ترع که از همون اول هش کنیم.
تایع password verify هم وقتی استفاده از ضروری میشه که یه طرف پسورد ها هش شده باشه
اما اینجا هیچ طرف پسورد ها هش شده نیست و بعد انجام یه شرطی هش میشه


فرشید مرادی
تخصص : noob
@eniack 3 سال پیش مطرح شد
0

@Rezanp7
خیلی از کدها به نظرکار میکنند و مشکلی ندارند ولی باید بهترین کد و بهینه ترین کد رو انتخاب کنید این چیزی که شما میفرمایید ابتدایی ترین راهه چک کردن پسورده ولی خب نظر شما هم محترمه ممنون از شما


Reza
تخصص : برنامه نویس وب
@Rezanp7 3 سال پیش آپدیت شد
0

@eniack
شما فرض کن بخوای با php فیلد پسورد رو validate کنی
اونجا هم نباید پسورد رو هش کنی
ایا باگ امنیتی به وجود میاد؟

پسورد نباید اول کار هش بشه چون دیگه نمیشه اون رو validate کرد

پسورد باید از تابع های ولیدیشن بگذره و در اخر کار به صورت هش شده توی دیتابیس ذخیره بشه


paradox
@wxyz4367 3 سال پیش مطرح شد
0

@eniack

ممنون
من به شکل زیر نوشتم تو if که دستور کوئری رو مینویسم ثبت نام انجام نمیشه
ولی وقتی تو else میزارم کوئری ثبت نام رو انجام میشه

    if(isset($_POST['register-button'])){
      $name = $_POST['names'];
      $national = $_POST['national'];
      $age = $_POST['age'];
      $password = password_hash($_POST['pass'], PASSWORD_DEFAULT);
      $repass = password_hash($_POST['repass'], PASSWORD_DEFAULT);
      $email = $_POST['email'];
      $gender = $_POST['gender'];

      if (password_verify($password, $repass)) {
          echo 'Password is valid!';
      }
      else
      {
        mysqli_query( $db , "INSERT INTO users( name , age , gender , national , email , password ) VALUES ( '$name' , '$age' , '$gender' , '$national'  , '$email' , '$password' )");

        echo "ثبت نام با موفقیت انجام شد";
      }

    }

paradox
@wxyz4367 3 سال پیش مطرح شد
0

@Rezanp7
ممنون از شما
روش دوم به چه صورته ؟
و یک موردی که هست برای لاگین هم پسورد هش باید قرار بدم که انجام بشه؟


Reza
تخصص : برنامه نویس وب
@Rezanp7 3 سال پیش مطرح شد
0
if(isset($_POST['register-button'])){
$name = $_POST['names'];
$national = $_POST['national'];
$age = $_POST['age'];
$password = password_hash($_POST['pass'], PASSWORD_DEFAULT);
$repass = $_POST['repass']
$email = $_POST['email'];
$gender = $_POST['gender'];

if (password_verify($repass, $password)) {
echo 'Password is valid!';
}
else
{
mysqli_query( $db , "INSERT INTO users( name , age , gender , national , email , password ) VALUES ( '$name' , '$age' , '$gender' , '$national'  , '$email' , '$password' )");

echo "ثبت نام با موفقیت انجام شد";
}

}

این روش دوم هست دقیقا همون کد شماست فقط نباید repass هش بشه و اینکه ارگومان دوم تابع password_verify باید پسورد هش شده باشه

اما برای لاگین شما توی دیتابیس یه پسورد هش شده دارید درسته؟
با استفاده از تابع password_verify ارگومان اول پسوردی که از user input میگیرید و ارگومان دوم پسورد هش شده که از دیتابیس select میکنید اینارو مثل بالا توی if انجام میدید اگه درست بود کاربر لاگین میشه در غیر این صورت ارور نمایش میدین


paradox
@wxyz4367 3 سال پیش مطرح شد
0

@Rezanp7
ممنون از شما رجیستر انجام شد
حالا برای لاگین پارامتر ها رو دقیق متوجه نشدم چیکار کنم به شکل زیر نوشتم

  if(isset($_POST['login-but'])){
    $mail= $_POST['email'];
    $password = password_hash($_POST['password'], PASSWORD_DEFAULT);

    if (password_verify($repass, $password)) {
    $LoginCheck = mysqli_query($db , "SELECT * FROM users WHERE email='$mail' AND password='$pass'");

    if(mysqli_num_rows($LoginCheck) > 0){
      $_SESSION['login-but'] = $mail;
      header('location:paneladmin/index.php');
    }

    }
    else{
      echo 'ورود انجام نشد';
    }
  }

ارور زیر دارم

Notice: Undefined variable: repass in C:\xampp\htdocs\amoozesh\login.php on line 208

Reza
تخصص : برنامه نویس وب
@Rezanp7 3 سال پیش آپدیت شد
0

@wxyz4367
اشتباه اولت اینه که همه جا پسورد رو هش میکنی.
پسورد فقط و فقط باید زمانی هش بشه که قرار insert بشه به دیتابیس و اونجا ذخیره بشه.
الان شما اومدی اینجا پسوردی که برای لاگین گرفتی رو هش کردی، خب دیگه نمیتونی چک کنی که پسورد درسته یا نه چون پارامتر اول تابع passwordverify باید پسورد رو به صورت معمولی وارد کنی.

اشتباه دومت اینه که اول میای پسورد رو چک میکنی بعد از دیتابیس اطلاعات کاربر رو select میکنی!!!!!
خب این پسورد رو دقیقا داری با چی چک میکنی؟

این پسورد باید به صورت زیر چک بشه اونم نه اول کار تو مرحله ای که ایمیل کاربر وجود داره.

password_verify($password, $hash_password)

متغیر password$ پسوردی که از کاربر دریافت کردی و متغیر hashpassword$ پسوردی هست که به صورت هش شده توی دیتابیس ذخیره شده

کد درست و کامل کد زیر هست

if(isset($_POST['login-but'])){
    $mail= $_POST['email'];
    $password = $_POST['password'];

    $LoginCheck = mysqli_query($db , "SELECT * FROM users WHERE email='$mail' ");

    $user = mysqli_fetch_assoc($LoginCheck);

    if($user){
       if(password_verify($password , $user['فیلد پسورد توی دیتابیس'])) {
        $_SESSION['login-but'] = $mail;
      header('location:paneladmin/index.php');
    }
    }

    echo 'login error!';

  }

شرح کد بالا:
تو قدم اول میایم یه query مینویسم که اطلاعات کاربر رو select میکنه خط بعدشم توی متغیر user$ (اطلاعات کاربر رو به صورت ارایه استخراج میکنیم اگه وجود داشت اطلاعات کاربر برمیگرده اگه وجود نداشت false برمیگرده)

توی if اول چک میکنیم که کاربر وجود داره یا نه اگه وجود نداشت که از if خارج میشه و ارور رو echo میکنه اما اگه وجود داشت وارد if بعدی میشه و پسورد کاربر رو چک میکنه اینجا هم اگه پسورد درست بود کاربر رو لاگین میکنیم اگرم نه که بازم از if خارج میشه ارور چاپ میشه


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام