انا انشئت موقع ويب بواسطة php وكتبت داله تسجيل الدخول بهذه الطريقه
<?php
$db_connection = mysqli_connect("localhost", "zeyad", "12345678", "trip");
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($db_connection, $query);
if (mysqli_num_rows($result) == 1) {
session_start();
$_SESSION['username'] = $username;
header('Location: dashboard.php');
} else {
header('Location: errorPage.php');
}
mysqli_close($db_connection);
?>
ولاكن موقعي تم اختراقه كيف احل المشكله و ماهي الثغره اريد شرح ارجوكم
يوجد مشكله خطيره بكتابة الكود تم اختراق موقعك عن طريق ثغره معروفه باسم SQL Injection
اولا لنعرف ما هو حقن Sql
حقن SQL هو أسلوب حقن التعليمات البرمجية المستخدمة لمهاجمة التطبيقات المستندة إلى البيانات، حيث يتم إدراج عبارات SQL الضارة في حقل إدخال للتنفيذ (على سبيل المثال، لتفريغ محتويات قاعدة البيانات إلى المهاجم).
في هذا النوع من التقنية، يستخدم المتسلل أو المهاجم بعض الأحرف الخاصة التي تحول استعلام SQL إلى استعلام SQL جديد ويمكن للمهاجم معالجة الاستعلام عن طريق إدخال المزيد من أنواع الكلمات الرئيسية.
يمكنك اتباح هذه التعليمات لحل المشكله
استخدام Prepared Statements
مفهوم الـ prepared statement هو أنه يتم إعداد الاستعلام SQL مسبقًا وتضمين معلمات (parameters) في الاستعلام بدلاً من إدراج القيم المدخلة مباشرة. هذا يمنع المهاجم من إدخال تعليمات SQL ضارة.
بدلاً من كتابة الاستعلام SQL مباشرة كما كان مع الثغرة، سنقوم بتحضير الاستعلام مع معلمات ومن ثم تزويد القيم المدخلة من قبل المستخدم. على سبيل المثال:
<?php
// اتصال بقاعدة البيانات
$db_connection = mysqli_connect("localhost", "username", "password", "database");
// معلومات تسجيل الدخول من النموذج
$username = $_POST['username'];
$password = $_POST['password'];
// استعلام مع معلمات
$query = "SELECT * FROM users WHERE username=? AND password=?";
$stmt = mysqli_prepare($db_connection, $query);
// تزويد القيم المدخلة كمعلمات
mysqli_stmt_bind_param($stmt, "ss", $username, $password);
// تنفيذ الاستعلام
mysqli_stmt_execute($stmt);
// استخراج البيانات
$result = mysqli_stmt_get_result($stmt);
// التحقق من صحة معلومات تسجيل الدخول
if (mysqli_num_rows($result) == 1) {
// تسجيل الدخول ناجح
session_start();
$_SESSION['username'] = $username;
header('Location: dashboard.php');
} else {
// فشل تسجيل الدخول
echo "خطأ: اسم المستخدم أو كلمة المرور غير صحيحة.";
}
// إغلاق اتصال قاعدة البيانات
mysqli_close($db_connection);
?>
ما تم فعله هنا هو استخدام mysqli_prepare() لإعداد الاستعلام مع معلمات ? ومن ثم تزويد القيم المدخلة باستخدام mysqli_stmt_bind_param(). هذا يجعل الاستعلام آمنًا ويمنع هجمات SQL Injection.
هذا هو حلا لمشكلة SQL Injection.
التعليقات