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

حماية كود PHP من الثغرات

Ayman Abdullah3

السؤال

<?php

session_start();



// توليد توكن CSRF عند بدء الجلسة

if (empty($_SESSION['token'])) {

    $_SESSION['token'] = bin2hex(random_bytes(32));

}



// الاتصال بقاعدة البيانات

$servername = "localhost";

$username = "root";

$password = "";

$dbname = "test_db";



$conn = new mysqli($servername, $username, $password, $dbname);



// تحقق من الاتصال

if ($conn->connect_error) {

    error_log("فشل الاتصال: " . $conn->connect_error); // سجل الخطأ في ملف السجل

    die("حدث خطأ أثناء الاتصال بقاعدة البيانات.");

}



// تسجيل المستخدم

if (isset($_POST['register'])) {

    // التحقق من توكن CSRF

    if (!hash_equals($_SESSION['token'], $_POST['token'])) {

        die("خطأ: التوكن غير صحيح.");

    }



    // التحقق من المدخلات

    $username = trim($_POST['username']);

    $password = $_POST['password'];



    // التحقق من طول اسم المستخدم (من 3 إلى 20 حرف)

    if (strlen($username) < 3 || strlen($username) > 20) {

        die("خطأ: يجب أن يكون اسم المستخدم بين 3 و 20 حرفًا.");

    }



    // التحقق من وجود رموز غير مسموح بها في اسم المستخدم

    if (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {

        die("خطأ: اسم المستخدم يمكن أن يحتوي على أحرف إنجليزية وأرقام وشرطة سفلية فقط.");

    }



    // التحقق من طول كلمة المرور (يجب أن تكون على الأقل 8 أحرف)

    if (strlen($password) < 8) {

        die("خطأ: يجب أن تكون كلمة المرور على الأقل 8 أحرف.");

    }



    // تشفير كلمة المرور

    $hashed_password = password_hash($password, PASSWORD_DEFAULT);



    // استخدام إعدادات مستعدة للحماية من SQL Injection

    $stmt = $conn->prepare("INSERT INTO users (username, password) VALUES (?, ?)");

    if ($stmt) {

        // ربط المتغيرات

        $stmt->bind_param("ss", $username, $hashed_password);



        // تنفيذ الاستعلام

        if ($stmt->execute()) {

            echo "تم التسجيل بنجاح!<br>";

            echo "اسم المستخدم المدخل: " . htmlspecialchars($username, ENT_QUOTES, 'UTF-8');

        } else {

            error_log("خطأ أثناء تنفيذ الاستعلام: " . $stmt->error); // سجل الخطأ في ملف السجل

            echo "حدث خطأ أثناء التسجيل. يرجى المحاولة لاحقًا.";

        }



        // إغلاق البيان

        $stmt->close();

    } else {

        error_log("خطأ في التحضير: " . $conn->error); // سجل الخطأ في ملف السجل

        echo "حدث خطأ أثناء معالجة الطلب.";

    }

}



$conn->close();

?>

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>تسجيل الاشتراك</title>

</head>

<body>

    <h2>تسجيل الاشتراك</h2>

    <form method="post" action="">

        <input type="text" name="username" placeholder="اسم المستخدم" required><br>

        <input type="password" name="password" placeholder="كلمة المرور" required><br>

        <input type="hidden" name="token" value="<?= htmlspecialchars($_SESSION['token'], ENT_QUOTES, 'UTF-8') ?>">

        <button type="submit" name="register">تسجيل</button>

    </form>

</body>

</html>

اريد التاكد هل تم حمابته من بعض الثغرات المستخدمه في الكود

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال ونص السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

الكود محسن بشكل كبير من حيث الأمان لأنك قمت بتضمين حماية CSRF واستخدام الاستعلامات المعلمة لمنع حقن SQL، وبالطبع هناك  مجال للتحسين.

الكود لا يتحقق هل اسم المستخدم موجودًا بالفعل في قاعدة البيانات، فيجب منع اسم المستخدم المكرر، أضف منطق لذلك قبل INSERT.

أيضًأ أنت تتحقق من إدخال المستخدم، لكن لا تتحقق من إدخال التوكن، عليك إضافة تحقق إدخال التوكن.

وبينما يتم فرض الحد الأدنى للطول، ضع في اعتبارك إضافة عمليات تحقق أكثر قوة لكلمة المرور،  فهناك مكتبات لذلك للتحقق من وجود مزيج من الأحرف الكبيرة والصغيرة والأرقام والرموز، أو تستطيع إنشاء دالة مخصصة بنفسك.

بخصوص توليد توكن عشوائي، من الأفضل استخدام طريقة أكثر أماناً مثل random_bytes(32) وتخزينها في متغير جلسة session  أمن.

ومن المستحسن استخدام filter_var لتنظيف اسم المستخدم قبل استخدامه في الاستعلام، فذلك يساعد في منع الأحرف غير المتوقعة من التسبب في مشاكل، حتى لو مرت بعمليات التحقق.

    $username = trim(filter_var($_POST['username'], FILTER_SANITIZE_STRING)); 

ولا يتم تهريب الـ output بشكل صحيح، اعتمد على htmlspecialchars() مع flag باسم ENT_QUOTES لتهريب المخرج، وذلك لمنع هجمات XSS.

<input type="hidden" name="token" value="<?= htmlspecialchars($_SESSION['token'], ENT_QUOTES, 'UTF-8') ?>">

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...