سلام دوستان من با کد زیر پسورد دیتابیس عوض میکنم ولی یه مشکلی هست که هر پسوردی تو 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");
}
}
}
?>
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 انجام میدید اگه درست بود کاربر لاگین میشه در غیر این صورت ارور نمایش میدین
@wxyz4367
سلام برای هش کردن از PASSWORD_BCRYPT استفاده کنید هم مطمعن تره و هم با فانکشن password_verify پسورد جدید و قبلیو چک میکنه
@eniack
ممنون از شما
به چه صورت باید تعریف کنم ؟
به این صورت که اشتباهه
$password = password_hash($_POST['pass']);
@wxyz4367
به این صورت استفاده میشه
$pass=
password_hash($_POST['pass'], PASSWORD_DEFAULT);
@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 "ثبت نام با موفقیت انجام شد";
}
}
@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 "ثبت نام با موفقیت انجام شد";
}
}
@wxyz4367
تکرار پسورد نباید هش بشه
بعدشم با عملگر == نمیتونید چک کنید که پسورد باهم مطابقت داره یا نه باید با تابع password_verify انجام بدید
@wxyz4367
سلام ، اینو تست کنید
یعنی قرار بدید جای if که پسورد رو چک میکنه
if (password_verify($password, $repass)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
دوتا روش وجود داره برای اینکار که من روش ساده ترش رو میگم بهت الان
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
بهش اشاره کرده
@eniack
مهم اینه پسوردی که توی دیتابیس ذخیره میشه هش شده باشه تا در صورت لو رفتن دیتا بیس نشه پسورد کاربر رو خوند
وگرنه فکر نکنم برای چک کردن موردی داشته باشه
@Rezanp7
این روش به هیچ عنوان تایید شده نیست ، حتی php واسه این کار خودش تابع گذاشته یعنی ذهنیت اینه که پسورد سمت بکند میاد باید هش شده باشه
@eniack
ما فقط اول دوتا استرینگ رو چک میکنیم و ریکوئستی هم نمیفرستیم یه جایی که بخواد خطرناک باشه یا نه
اگه پسورد ها درست بود اونقت هش میشه و ریکوئست به سمت بک اند میره
در کل منطقی ترع که از همون اول هش کنیم.
تایع password verify هم وقتی استفاده از ضروری میشه که یه طرف پسورد ها هش شده باشه
اما اینجا هیچ طرف پسورد ها هش شده نیست و بعد انجام یه شرطی هش میشه
@Rezanp7
خیلی از کدها به نظرکار میکنند و مشکلی ندارند ولی باید بهترین کد و بهینه ترین کد رو انتخاب کنید این چیزی که شما میفرمایید ابتدایی ترین راهه چک کردن پسورده ولی خب نظر شما هم محترمه ممنون از شما
@eniack
شما فرض کن بخوای با php فیلد پسورد رو validate کنی
اونجا هم نباید پسورد رو هش کنی
ایا باگ امنیتی به وجود میاد؟
پسورد نباید اول کار هش بشه چون دیگه نمیشه اون رو validate کرد
پسورد باید از تابع های ولیدیشن بگذره و در اخر کار به صورت هش شده توی دیتابیس ذخیره بشه
ممنون
من به شکل زیر نوشتم تو 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 "ثبت نام با موفقیت انجام شد";
}
}
@Rezanp7
ممنون از شما
روش دوم به چه صورته ؟
و یک موردی که هست برای لاگین هم پسورد هش باید قرار بدم که انجام بشه؟
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 انجام میدید اگه درست بود کاربر لاگین میشه در غیر این صورت ارور نمایش میدین
@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
@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 خارج میشه ارور چاپ میشه
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟