كيفية حماية النماذج (Forms) من الهجمات في PHP

تمت الكتابة بواسطة: عبد الحكيم

تارخ آخر تحديث: 02 سبتمبر 2024

محتوى المقال

كيفية حماية النماذج (Forms) من الهجمات في PHP

تُعتبر النماذج (Forms) جزءًا أساسيًا من أي تطبيق ويب، حيث تسمح للمستخدمين بإدخال البيانات والتفاعل مع الموقع. ومع ذلك، تعد النماذج هدفًا شائعًا للهجمات الإلكترونية مثل SQL Injection، Cross-Site Scripting (XSS)، وهجمات Cross-Site Request Forgery (CSRF). في هذا المقال، سنتناول أفضل الممارسات والتقنيات اللازمة لحماية النماذج في PHP من هذه الهجمات وضمان أمان تطبيقات الويب.

1. حماية النماذج من SQL Injection

SQL Injection هو نوع من الهجمات التي يتم فيها إدخال كود SQL ضار عبر مدخلات المستخدم بهدف التلاعب في قاعدة البيانات. لتجنب هذا النوع من الهجمات، يجب عليك دائمًا تنقية (sanitize) البيانات المدخلة من قبل المستخدم واستخدام العبارات المجهزة (Prepared Statements) عند التعامل مع قواعد البيانات.

<?php
# الاتصال بقاعدة البيانات باستخدام PDO
$conn = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");

# إعداد العبارة المجهزة
$stmt = $conn->prepare("INSERT INTO users (username, email) VALUES (:username, :email)");

# ربط القيم بالمعلمات وإجراء الاستعلام
$stmt->execute([':username' => $_POST['username'], ':email' => $_POST['email']]);
?>

استخدام العبارات المجهزة (Prepared Statements) مع PDO أو MySQLi يضمن أن بيانات المستخدم تُعامل كقيم وليس كأجزاء من استعلام SQL، مما يحمي من إدخال كود ضار.

2. حماية النماذج من XSS (Cross-Site Scripting)

XSS هو نوع من الهجمات حيث يقوم المهاجم بإدخال كود JavaScript ضار في صفحات الويب، مما يسمح له بسرقة بيانات المستخدم أو تنفيذ عمليات غير مصرح بها. لمنع هذه الهجمات، يجب عليك دائمًا ترميز (encode) المدخلات التي تُعرض في المتصفح باستخدام htmlspecialchars:

<?php
# ترميز بيانات المستخدم قبل عرضها في المتصفح
$safe_username = htmlspecialchars($_POST['username'], ENT_QUOTES, "UTF-8");
echo "مرحبًا، " . $safe_username;
?>

تقوم htmlspecialchars بتحويل الأحرف الخاصة (مثل < و>) إلى رموز HTML مكافئة، مما يمنع تنفيذ كود JavaScript الضار.

3. حماية النماذج من CSRF (Cross-Site Request Forgery)

CSRF هو نوع من الهجمات حيث يتم خداع المستخدم لتنفيذ طلب غير مصرح به على موقع آخر يثق به. يمكن منع هذا النوع من الهجمات باستخدام رموز التحقق (tokens) التي تُضاف إلى كل نموذج. يجب التحقق من هذا الرمز عند استلام الطلب للتأكد من أن الطلب يأتي من المستخدم نفسه وليس من جهة خارجية.

خطوات حماية النماذج من CSRF:

  • إنشاء رمز CSRF عند عرض النموذج: يجب إنشاء رمز عشوائي وتخزينه في الجلسة.
  • إضافة رمز CSRF إلى النموذج: يجب تضمين الرمز كحقل مخفي في النموذج.
  • التحقق من صحة رمز CSRF عند استلام الطلب: تحقق من تطابق الرمز المرسل مع الرمز المخزن في الجلسة.
<?php
# بدء جلسة المستخدم
session_start();

# إنشاء رمز CSRF وتخزينه في الجلسة
if (!isset($_SESSION['csrf_token'])) {
   $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
$csrf_token = $_SESSION['csrf_token'];

# تضمين رمز CSRF في النموذج
echo '$csrf_token . '">';

# التحقق من رمز CSRF عند استلام الطلب
if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
   # الرمز صحيح، متابعة معالجة النموذج
   # ...
} else {
   # الرمز غير صحيح، منع الطلب
   die("طلب غير صالح");
}
?>

بهذه الطريقة، يمكنك التأكد من أن الطلبات التي تتلقاها من النماذج جاءت من مصادر موثوقة ولم يتم التلاعب بها من قبل أطراف خارجية.

4. التحقق من المدخلات (Input Validation)

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

<?php
# التحقق من صحة عنوان البريد الإلكتروني
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if ($email === false) {
   # عنوان البريد الإلكتروني غير صالح
   die("عنوان البريد الإلكتروني غير صالح");
}

# التحقق من صحة الرقم الصحيح
$age = filter_var($_POST['age'], FILTER_VALIDATE_INT);
if ($age === false) {
   # العمر يجب أن يكون رقمًا صحيحًا
   die("العمر يجب أن يكون رقمًا صحيحًا");
}
?>

استخدام filter_var للتحقق من صحة المدخلات يضمن أن البيانات التي يتم إدخالها صحيحة وآمنة.

5. الحد من حجم المدخلات (Input Size Limitation)

لتجنب هجمات الرفض من الخدمة (DoS) أو تجاوز الذاكرة، يجب تحديد حجم المدخلات التي يمكن قبولها في النماذج. يمكنك القيام بذلك عن طريق تعيين خاصية maxlength في عناصر النموذج، وأيضًا التحقق من حجم المدخلات في جانب الخادم.

type="text" name="username" maxlength="50">

<?php
# التحقق من حجم المدخلات في جانب الخادم
if (strlen($_POST['username']) > 50) {
   die("اسم المستخدم طويل للغاية");
}
?>

يساعد تحديد حجم المدخلات على حماية الخادم من الهجمات التي تهدف إلى استهلاك موارد الخادم أو تخزين بيانات غير مرغوب فيها.

الخلاصة

حماية النماذج في PHP من الهجمات تتطلب اتباع أفضل الممارسات في التحقق من صحة المدخلات، استخدام العبارات المجهزة، منع هجمات XSS وCSRF، وتحديد حجم المدخلات. بتطبيق هذه الخطوات، يمكنك تعزيز أمان تطبيقك وتقليل المخاطر الأمنية المرتبطة بالنماذج.

طور مهاراتك: مقالات يجب قراءتها في البرمجة