Marwan800 نشر 25 ديسمبر 2020 أرسل تقرير نشر 25 ديسمبر 2020 السلام عليكم ورحمة الله وبركاته تحيه طيبه للجميع لدي استفسار لو تكرمتو قمت بتخزين باسورد في قاعدة البيانات عن طريق عمل له : $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); ?> احد يعرف ماذا ممكن اضيف الى الكود اعلاه حتى يعمل بشكل الصحيح في الاستعلام هذا الكود عباره عن صفحة تسجيل دخول المستخدم 1 اقتباس
1 محمد وسيم الحبش نشر 25 ديسمبر 2020 أرسل تقرير نشر 25 ديسمبر 2020 وعليكم السلام ورحمة الله وبركاته @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 اقتباس
1 أحمد حبنكة نشر 25 ديسمبر 2020 أرسل تقرير نشر 25 ديسمبر 2020 (معدل) التحقق من كلمة السر لا يكون كما كتبت، يجب مقارنة كلمة السر القادمة من صفحة تسجيل الدخول باستخدام تابع 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); تم التعديل في 25 ديسمبر 2020 بواسطة أحمد حبنكة 1 اقتباس
1 محمد وسيم الحبش نشر 26 ديسمبر 2020 أرسل تقرير نشر 26 ديسمبر 2020 بتاريخ 8 دقائق مضت قال Marwan800: سابقا الكود كان بعد التحقق يجلب لي بيانات المستخدم المحدد كلها المرتبطه به مثل اسم المستخدم رقم هاتفه كلمة السر الدولة وغيرها من بيانات التي توجد في قاعدة البيانات ولكن الان مع الكود اعلاه هذا الامر لا يحدث انا لا احصل على اي بيانات فقط يتم الاتصال او التحقق بنجاح هل يوجد حل لهذه المشكله؟انا احتاج الى بياناته حيث انني اقوم بعد تسجيل دخول المستخدم باخذ بياناته وتسجيلها في SharedPreferences لذلك انا احتاج الى البيانات ايضا مرحباً @Marwan800 بيانات المستخدم موجودة في المتحول الذي اسمه $user , وأنت تقوم به ما تشاء (( طباعة , تحويل ل JSON الخ .....)) . تحياتي 1 اقتباس
1 محمد وسيم الحبش نشر 26 ديسمبر 2020 أرسل تقرير نشر 26 ديسمبر 2020 بتاريخ 18 دقائق مضت قال Marwan800: اعلم اخي ولكن كيف ممكن استخرجها ؟الان كودي لا يعرض اي بيانات بعد التحقق من الباسورد هو فقط يتحقق الصراحة لم أفهم قصدك في كلمة أستخرجها , إذا كنت فهمت ما تعنيه فال $user هو عبارة عن مصفوفة الآن , فيمكنك كتابة : $user['phone'] أو أي حقل ضمن الداتابيز 1 اقتباس
0 Marwan800 نشر 26 ديسمبر 2020 الكاتب أرسل تقرير نشر 26 ديسمبر 2020 اسعد الله اوقاتكم بكل خير ربي يعطيكم الف صحه وعافيه يا رب وشكر لكم كثير @محمد وسيم الحبش @أحمد حبنكة قمت بتطبيق ما تم ذكره وقمت باغلاق نقطة الحقن في الملف وتحقق من الرقم السري بالاضافة الى اسم المستخدم او رقم هاتفه المرتبط بحسابه ونتيجة النهائية كانت كالتالي: <?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 لذلك انا احتاج الى البيانات ايضا هل يوجد حل لذلك؟لو بكلف عليكم اعتذر على ذلك 1 اقتباس
0 Marwan800 نشر 26 ديسمبر 2020 الكاتب أرسل تقرير نشر 26 ديسمبر 2020 بتاريخ 1 دقيقة مضت قال محمد وسيم الحبش: مرحباً @Marwan800 بيانات المستخدم موجودة في المتحول الذي اسمه $user , وأنت تقوم به ما تشاء (( طباعة , تحويل ل JSON الخ .....)) . تحياتي اهلا اخي @محمد وسيم الحبش اعلم اخي ولكن كيف ممكن استخرجها ؟الان كودي لا يعرض اي بيانات بعد التحقق من الباسورد هو فقط يتحقق 1 اقتباس
0 Marwan800 نشر 26 ديسمبر 2020 الكاتب أرسل تقرير نشر 26 ديسمبر 2020 @محمد وسيم الحبشربي يعطيك الف صحه وعافيه اخي الكريم اقتباس
السؤال
Marwan800
السلام عليكم ورحمة الله وبركاته
تحيه طيبه للجميع
لدي استفسار لو تكرمتو
قمت بتخزين باسورد في قاعدة البيانات عن طريق عمل له : $hashed_password=password_hash($password,PASSWORD_DEFAULT);
الان الكود يعمل بنجاح والباسورد يتم تخزينه بنجاح بطريقة الصحيحه
ولكن اواجه مشكلة حيث انني لا استطيع استعادته بشكل الصحيح من خلال password_verify قمت بعمل محاولات مختلفه ولم ينجح الامر
احاول استعادته من خلال الصفحة التالية :
احد يعرف ماذا ممكن اضيف الى الكود اعلاه حتى يعمل بشكل الصحيح في الاستعلام
هذا الكود عباره عن صفحة تسجيل دخول المستخدم
7 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.