PHP: صفحات آمنة للأعضاء فقط مع نظام تسجيل الدخول
تحديات الكود المقدم
يواجه كود PHP المقدم العديد من المشكلات التي تعيق عمله الوظيفة:
- استرجاع نتائج الاستعلام : بدلاً من استخدام $data1 = $conn->query($sql1);، الطريقة الصحيحة هي استخدام $data = mysqli_fetch_array($conn->query($sql1)); أو $data = $conn->query($sql1)->fetch_array(); لجلب نتائج الاستعلام.
- اتصال قاعدة البيانات وتنفيذها: يجب إنشاء الاتصال بقاعدة البيانات باستخدام $total = $data = 0; قبل تنفيذ أي استعلامات.
- بناء جملة MySQLi : يجب أن يستخدم الاستعلام الخاص بإدراج الرمز المميز علامات الرجوع () حول أسماء الجدول والأعمدة (INSERT INTO tokens (tk, gauth) VALUES (?,? )`) بدلاً من علامات الاقتباس المفردة.
- مصادقة المستخدم: يجب أن يعود منطق المصادقة نتيجة الاستعلام بدلاً من الاعتماد على القيم المنطقية ($result = $conn->query($sql3)->fetch_array();).
- إنشاء الرمز المميز: الرمز المميز الموجود طريقة الإنشاء غير آمنة لأنها تستخدم opensl_random_pseudo_bytes(). بدلاً من ذلك، يجب أن تستخدم التعليمات البرمجية منشئ أرقام عشوائية آمن تشفيرًا (CSPRNG) مثل Rand_bytes().
الحل المقترح
- تبسيط عمليات قاعدة البيانات: استخدم استعلامًا واحدًا لاسترداد معلومات المستخدم والتحقق من بيانات الاعتماد.
- استخدم البيانات المعدة : ربط المعلمات لمنع ثغرات حقن SQL.
- إنشاء الرموز بشكل آمن : استخدم Random_bytes () أو وظيفة مماثلة لإنشاء رمز مميز آمن.
- تخزين بيانات المصادقة في الجلسة : احفظ رمز المصادقة في متغير الجلسة بدلاً من ملف تعريف الارتباط.
- التحقق من الصحة الرموز : قم بإجراء استعلام قاعدة بيانات مقابل جدول الرموز المميزة للتحقق من صحة الرمز المميز المقدم.
الكود المحسن
يعالج الكود المنقح التالي المشكلات المحددة ويوفر عضوًا أكثر أمانًا -نظام تسجيل الدخول بالصفحة فقط:
connect_error) {
يموت("فشل الاتصال:" . $conn->connect_error);
}
// إعداد بيان لمصادقة المستخدم
$sql_auth = $conn->prepare("SELECT * من المستخدمين أين اسم المستخدم =؟ وكلمة المرور = ؟");
$sql_auth->bind_param("ss", $_POST['uname'], $_POST['pss']);
$sql_auth->تنفيذ();
$result_auth = $sql_auth->get_result();
// مصادقة المستخدم
إذا ($result_auth->num_rows > 0) {
$user = $result_auth->fetch_assoc();
$صحيح = صحيح؛
} آخر {
$صحيح = خطأ؛
}
// إنشاء رمز مميز
إذا (صحيح === صحيح) {
$hex = bin2hex(random_bytes(3));
$_SESSION['auth'] = $hex;
$_SESSION['logstat'] = TRUE;
}
// إغلاق الاتصال
$conn->إغلاق();
?>