تُعد حماية البيانات المدخلة في قاعدة بيانات MySQL من هجمات SQL Injection أمرًا بالغ الأهمية عند تطوير تطبيقات الويب. يمكن أن يؤدي الإهمال في التعامل مع إدخال البيانات إلى تعريض قاعدة البيانات للاختراق، مما يعرض بيانات المستخدمين للخطر. في هذا المقال، سنتعرف على كيفية حماية البيانات من SQL Injection باستخدام PHP والعبارات المجهزة (Prepared Statements).
ما هو SQL Injection؟
SQL Injection هو نوع من الهجمات التي يتم فيها إدخال كود ضار في استعلام SQL عبر إدخال بيانات غير آمنة من قبل المستخدم. إذا لم يتم التعامل مع هذه البيانات بشكل صحيح، يمكن للمهاجمين تنفيذ استعلامات غير مصرح بها على قاعدة البيانات، مما يؤدي إلى سرقة أو حذف البيانات.
كيف يعمل SQL Injection؟
تحدث هجمات SQL Injection عندما يُسمح بإدخال بيانات المستخدم مباشرة في استعلام SQL بدون تنقية أو إعداد مناسب. على سبيل المثال، الاستعلام التالي غير محمي:
<?php
$username = $_POST['username'];
$password = $_POST['password'];
# استعلام SQL غير محمي
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = $conn->query($sql);
?>
في هذا المثال، يمكن للمهاجم إدخال كود SQL ضار في حقول الإدخال لتنفيذ استعلام غير مصرح به. على سبيل المثال، إذا أدخل المهاجم `’ OR ‘1’=’1’` كاسم مستخدم أو كلمة مرور، سيتم تنفيذ الاستعلام بنجاح وسيتمكن من الوصول إلى البيانات.
استخدام العبارات المجهزة (Prepared Statements) للحماية من SQL Injection
الطريقة الأكثر فعالية لحماية بياناتك من هجمات SQL Injection هي استخدام العبارات المجهزة (Prepared Statements). في هذه الطريقة، يتم فصل الاستعلام عن البيانات المدخلة، مما يمنع إدخال كود SQL ضار.
حماية البيانات باستخدام MySQLi
يمكنك استخدام MySQLi مع العبارات المجهزة لحماية البيانات المدخلة. المثال التالي يوضح كيفية القيام بذلك:
<?php
# إعداد العبارة المجهزة
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
# ربط المعلمات بالعبارة المجهزة
$stmt->bind_param("ss", $username, $password);
# تنفيذ العبارة المجهزة
$stmt->execute();
# جلب النتائج
$result = $stmt->get_result();
?>
حماية البيانات باستخدام PDO
PDO يدعم العبارات المجهزة بشكل طبيعي، مما يجعلها خيارًا قويًا لحماية البيانات. المثال التالي يوضح كيفية استخدام PDO للحماية من SQL Injection:
<?php
# إعداد الاتصال بقاعدة البيانات باستخدام PDO
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
# إعداد نمط الخطأ
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
# إعداد العبارة المجهزة
$stmt = $conn->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
# ربط القيم بالمعلمات
$stmt->bindParam(":username", $username);
$stmt->bindParam(":password", $password);
# تنفيذ العبارة المجهزة
$stmt->execute();
# جلب النتائج
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($result);
} catch (PDOException $e) {
echo "خطأ: " . $e->getMessage();
}
?>
التعامل مع الأخطاء في العبارات المجهزة
من المهم التعامل مع الأخطاء بشكل صحيح عند استخدام العبارات المجهزة لضمان استقرار التطبيق. عند استخدام MySQLi أو PDO، يمكن استخدام الكتل الشرطية if
وtry-catch
للتحقق من نجاح الاستعلام والتعامل مع أي أخطاء قد تحدث.
إغلاق الاتصال بقاعدة البيانات
بعد الانتهاء من استخدام العبارات المجهزة، من المهم إغلاق الاتصال بقاعدة البيانات لتحرير الموارد. في MySQLi، يتم إغلاق الاتصال باستخدام mysqli_close()
، بينما في PDO يتم ذلك بإسناد null
إلى متغير الاتصال.
<?php
# إغلاق الاتصال بقاعدة البيانات في MySQLi
mysqli_close($conn);
# إغلاق الاتصال بقاعدة البيانات في PDO
$conn = null;
?>
الخلاصة
حماية البيانات المدخلة في قاعدة بيانات MySQL من هجمات SQL Injection هو أمر بالغ الأهمية لضمان أمان واستقرار تطبيقات الويب. باستخدام العبارات المجهزة (Prepared Statements) في PHP، يمكنك ضمان أمان البيانات وتقليل خطر تعرض تطبيقك لهذه الهجمات.