اذهب إلى المحتوى
  • 0

مشكلة استعلام عن الباسورد password_verify

Marwan800

السؤال

السلام عليكم ورحمة الله وبركاته

تحيه طيبه للجميع

 

لدي استفسار لو تكرمتو 

قمت بتخزين باسورد في قاعدة البيانات عن طريق عمل له : $hashed_password=password_hash($password,PASSWORD_DEFAULT);

 

الان الكود يعمل بنجاح والباسورد يتم تخزينه بنجاح بطريقة الصحيحه 

ولكن اواجه مشكلة حيث انني لا استطيع استعادته بشكل الصحيح من خلال password_verify قمت بعمل محاولات مختلفه ولم ينجح الامر 

احاول استعادته من خلال الصفحة التالية :

<?php
include 'connt.php';
 
 $json = file_get_contents('php://input');
 $obj = json_decode($json,true);
 $password = $obj['password'];
 $loginQuery = "select * from user where password = '$password' ";
 
 
     $check = mysqli_fetch_array(mysqli_query($con,$loginQuery));
    if($check){
    
         $check['result'] = 'Login Matched';
         $SuccessMSG = json_encode($check);
         echo $SuccessMSG ; 
     }
    
     else{
        $InvalidMSG= array("result"=>"Invalid Username or Password Please Try Again");
        $InvalidMSGJSon = json_encode($InvalidMSG);
         echo $InvalidMSGJSon ;
     
     }
 
 
 
 
 
 mysqli_close($con);
?>

احد يعرف ماذا ممكن اضيف الى الكود اعلاه حتى يعمل بشكل الصحيح في الاستعلام

هذا الكود عباره عن صفحة تسجيل دخول المستخدم

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

وعليكم السلام ورحمة الله وبركاته @Marwan800

هناك عدة ملاحظات يجب تعديلها ضمن الكود الخاص بك :

يجب عند الاستعلام عن مستخدم ضمن الداتابيز أن نستخدم اسم المستخدم أو إيميله وليس كلمة السر , لأنها ببساطة مشفرة ولا يصح الاستعلام عليها مباشرة من الداتابيز :

 $email = $obj['email'];
 $loginQuery = "select * from user where email = '$email' ";

الآن بعد أن نفذنا هذا الاستعلام , نتأكد بالبداية أن لدينا مستخدم لديه هذا الإيميل بالفعل , فإن كان كذلك نستخدم تابع ال password_verify للتحقق من كلمة المرور المدخلة إن كانت مماثلة لما في قاعدة البيانات :

$user = mysqli_fetch_array(mysqli_query($con,$loginQuery));

// إذا وجدنا مستخدم بالإيميل المدخل من الفورم أو من أي مكان بالموقع
if(count($user) == 1)
{
  $password = $obj['password'];
  if (password_verify($password, $user['password'])) {
    echo 'تم التحقق من كل شيء بنجاح';
    die;
  } 
  else {
    echo 'كلمة المرور المدخلة خاطئة';
    die;
  }
}
else
{
  echo "الإيميل المدخل غير موجود";
  die;
}

تحياتي .

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

التحقق من كلمة السر لا يكون كما كتبت، يجب مقارنة كلمة السر القادمة من صفحة تسجيل الدخول باستخدام تابع password_verify هكذا:

$check = password_verify(obj["password"],$password_hash_from_database);

أي أننا نمرر لتابع password_verify كلمة السر من صفحة تسجيل الدخول وhash من قاعدة البيانات الذي خزناه سابقاً باستخدام تابع password_hash ، في حالتك يمكنك جلب hash من خلال اسم المستخدم كما يلي:

$json = file_get_contents('php://input');
$obj = json_decode($json,true);
$password = $obj['password'];
$username = $obj['username'];
$loginQuery = "select password from user where username = '$username' ";
$query_result = mysqli_query($con,$loginQuery);
$row = mysqli_fetch_assoc($query_result);
if($row !== NULL){
    $password_hash_from_database = $row['password'];
    $check = password_verify($password,$password_hash_from_database);
}
mysqli_free_result($query_result);

 

ويمكن جلب password hash المخزن في database بمعايير أخرى مثل اﻹيميل وذلك حسب قاعدة بياناتك.

 

طبعاً لاحظ استخدام تابع mysqli_free_result  وهو شيء ضروري بعد تنفيذ أي query ، أيضاً انتبه أن الكود السابق يعاني من SQL Injection ﻷنك لا تقوم بأي عملية escape على متحول $username وتضعه كما هو في query string ، حل هذه المشكلة يتعلق بالـframework المستعملة ولكن بما أنك تستعمل pure php يجب استدعاء تابع mysqli_real_escape_string على متحول username هكذا:

 

$json = file_get_contents('php://input');
$obj = json_decode($json,true);
$password = $obj['password'];
$username = mysqli_real_escape_string($con,$obj['username']);
$loginQuery = "select password from user where username = '$username' ";
$query_result = mysqli_query($con,$loginQuery);
$row = mysqli_fetch_assoc($query_result);
if($row !== NULL){
    $password_hash_from_database = $row['password'];
    $check = password_verify($password,$password_hash_from_database);
}
mysqli_free_result($query_result);

 

 

تم التعديل في بواسطة أحمد حبنكة
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 8 دقائق مضت قال Marwan800:

سابقا الكود كان بعد التحقق يجلب لي بيانات المستخدم المحدد كلها المرتبطه به مثل اسم المستخدم رقم هاتفه كلمة السر الدولة وغيرها من بيانات التي توجد في قاعدة البيانات ولكن الان مع الكود اعلاه هذا الامر لا يحدث انا لا احصل على اي بيانات فقط يتم الاتصال او التحقق بنجاح هل يوجد حل لهذه المشكله؟انا احتاج الى بياناته حيث انني اقوم بعد تسجيل دخول المستخدم باخذ بياناته وتسجيلها في SharedPreferences لذلك انا احتاج الى البيانات ايضا 

مرحباً  @Marwan800

بيانات المستخدم موجودة في المتحول الذي اسمه $user , وأنت تقوم به ما تشاء (( طباعة , تحويل ل JSON الخ .....)) .

تحياتي 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 18 دقائق مضت قال Marwan800:

اعلم اخي ولكن كيف ممكن استخرجها ؟الان كودي لا يعرض اي بيانات بعد التحقق من الباسورد هو فقط يتحقق 

الصراحة لم أفهم قصدك في كلمة أستخرجها , إذا كنت فهمت ما تعنيه فال $user هو عبارة عن مصفوفة الآن , فيمكنك كتابة :

$user['phone']

أو أي حقل ضمن الداتابيز

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

اسعد الله اوقاتكم بكل خير

ربي يعطيكم الف صحه وعافيه يا رب وشكر لكم كثير @محمد وسيم الحبش @أحمد حبنكة

قمت بتطبيق ما تم ذكره وقمت باغلاق نقطة الحقن في الملف وتحقق من الرقم السري بالاضافة الى اسم المستخدم او رقم هاتفه المرتبط بحسابه ونتيجة النهائية كانت كالتالي:

 

<?php
include 'connt.php';
$json = file_get_contents('php://input');
$obj = json_decode($json,true);
//$phone = $obj['phone'];
 $phone = '99999999';
$sql = "select * from user where phone =?"; 
$stmt = $con->prepare($sql); 
$stmt->bind_param("s", $phone);
$stmt->execute();
$result = $stmt->get_result(); 
$user = $result->fetch_assoc(); 

 if($user){
 // $password = $obj['password'];
  $password ='1';

 if (password_verify($password, $user['password'])) {

         $check['result'] = 'Login Matched';
         $SuccessMSG = json_encode($check);
         echo $SuccessMSG ; 
     

  } else {
   $InvalidMSG= array("result"=>"Invalid Username or Password Please Try Again");
        $InvalidMSGJSon = json_encode($InvalidMSG);
         echo $InvalidMSGJSon ;
  }

}else{
  echo "";

}

mysqli_close($con);
?>

الكود يعمل 100%100 الان ولكن توجد مشكلة بسيطة ظهرت

سابقا الكود كان بعد التحقق يجلب لي بيانات المستخدم المحدد كلها المرتبطه به مثل اسم المستخدم رقم هاتفه كلمة السر الدولة وغيرها من بيانات التي توجد في قاعدة البيانات ولكن الان مع الكود اعلاه هذا الامر لا يحدث انا لا احصل على اي بيانات فقط يتم الاتصال او التحقق بنجاح هل يوجد حل لهذه المشكله؟انا احتاج الى بياناته حيث انني اقوم بعد تسجيل دخول المستخدم باخذ بياناته وتسجيلها في SharedPreferences لذلك انا احتاج الى البيانات ايضا 

 

هل يوجد حل لذلك؟لو بكلف عليكم اعتذر على ذلك

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال محمد وسيم الحبش:

مرحباً  @Marwan800

بيانات المستخدم موجودة في المتحول الذي اسمه $user , وأنت تقوم به ما تشاء (( طباعة , تحويل ل JSON الخ .....)) .

تحياتي 

اهلا اخي @محمد وسيم الحبش

اعلم اخي ولكن كيف ممكن استخرجها ؟الان كودي لا يعرض اي بيانات بعد التحقق من الباسورد هو فقط يتحقق 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...