تنقية إدخال المستخدم
أزيلوا الأحرف الخطرة باستخدام htmlspecialchars وfilter_input
تنقية إدخال المستخدم درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.
التنقية مقابل التحقق من الصحة
التحقق من الصحة يفحص ما إذا كانت البيانات تستوفي المتطلبات (ويرفضها إذا لم تستوفها).
التنقية تنظف البيانات بإزالة الأحرف الخطرة أو ترميزها لتصبح آمنة للاستخدام.
كلاهما ضروري — تحققوا أولًا، ثم نقّوا البيانات قبل إخراجها.
htmlspecialchars() لإخراج HTML
اهربوا المخرجات دائمًا قبل إدراجها في HTML لمنع XSS:
<?php
$name = '<script>alert(1)</script>';
// Dangerous — executes script:
// echo $name;
// Safe:
echo htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// <script>alert(1)</script>htmlentities() مقابل htmlspecialchars()
كلاهما يهرب HTML، لكن htmlentities يحوّل جميع الأحرف القابلة للتحويل؛ بينما يحوّل htmlspecialchars الأحرف الخمسة الأكثر خطورة فقط:
<?php
$str = '<b>café</b> & "bar"';
// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
// htmlentities: also converts é → é
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8filter_var FILTER_SANITIZE_*
تزيل أوضاع التنقية في filter_var المحتوى الخطِر:
<?php
$rawEmail = 'user(bad)@exam<ple.com';
$clean = filter_var($rawEmail, FILTER_SANITIZE_EMAIL);
echo $clean; // user@example.com
$rawUrl = 'http://exa mple.com/pa th?q=foo bar';
$cleanUrl = filter_var($rawUrl, FILTER_SANITIZE_URL);
echo $cleanUrl;strip_tags()
أزيلوا علامات HTML من سلسلة نصية، مع إمكانية الاحتفاظ بالعلامات المسموح بها:
<?php
$input = '<p>Hello <b>World</b> <script>alert(1)</script></p>';
// Remove all tags:
echo strip_tags($input);
// Hello World alert(1)
// Keep only <b> and <i>:
echo strip_tags($input, '<b><i>');
// Hello <b>World</b>تنقية SQL
لا تنقّوا SQL باستخدام دوال السلاسل النصية أبدًا — استخدموا دائمًا العبارات المُعدّة. النهج الصحيح:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
// WRONG — even with addslashes this is dangerous:
// $sql = "SELECT * FROM users WHERE email = '" . addslashes($email) . "'";
// CORRECT — prepared statement:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();addslashes() مقابل العبارات المُعدّة
تهرب addslashes() الشرطة المائلة العكسية وعلامات الاقتباس — لكنها ليست آمنة لـ SQL. استخدموا عبارات PDO المُعدّة بدلًا منها. قد تظل addslashes() مفيدة لأغراض غير مرتبطة بـ SQL، مثل إنشاء سلاسل JavaScript:
<?php
// For embedding PHP string into JavaScript (still escape via json_encode):
$jsData = json_encode(['name' => $userInput], JSON_HEX_QUOT);
echo "<script>var data = $jsData;</script>";تنقية أسماء الملفات
أزيلوا الأحرف الخطرة من أسماء الملفات المرفوعة:
<?php
function sanitizeFilename(string $name): string {
// Remove path traversal chars and other dangerous ones
$name = basename($name); // strip any path
$name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name); // only safe chars
$name = preg_replace('/_{2,}/', '_', $name); // collapse underscores
return strtolower($name);
}
echo sanitizeFilename('../../../etc/passwd'); // etc_passwd
echo sanitizeFilename('My Photo (1).JPG'); // my_photo_1_.jpgتحويل المعرّفات إلى أعداد صحيحة
أبسط طريقة لتنقية المعرّفات الرقمية — حوّلوها إلى int، إذ يؤدي ذلك إلى تجاهل أي محتوى غير رقمي:
<?php
// Never do this:
$id = $_GET['id'];
$sql = "SELECT * FROM posts WHERE id = $id";
// Safe approach 1: cast to int
$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) die('Invalid ID');
// Safe approach 2: validate
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$id) die('Invalid ID');يعتمد سياق الإخراج على نوع التنقية
تحتاج سياقات الإخراج المختلفة إلى أساليب هروب مختلفة:
- محتوى HTML →
htmlspecialchars() - سمة HTML →
htmlspecialchars(ENT_QUOTES) - JSON/JavaScript →
json_encode() - مَعلمة URL →
urlencode() - SQL → العبارات المُعدّة
urlencode وrawurlencode
رمّزوا القيم لاستخدامها في عناوين URL:
<?php
$search = 'hello world & PHP';
echo urlencode($search);
// hello+world+%26+PHP (+ for spaces)
echo rawurlencode($search);
// hello%20world%20%26%20PHP (RFC 3986 — use in paths)
$url = 'https://example.com/search?q=' . urlencode($search);
echo $url;تحقق سريع
ما الدالة الصحيحة لمنع حقن SQL عند استخدام إدخال المستخدم في استعلام قاعدة بيانات؟
مراجعة: تنقية الإدخال
قواعد التنقية:
- إخراج HTML →
htmlspecialchars(ENT_QUOTES, 'UTF-8') - SQL → العبارات المُعدّة، وليس تهريب السلاسل النصية
- عناوين URL →
urlencode()أوrawurlencode() - أسماء الملفات → أزيلوها باستخدام Regex، واستخدموا
basename() - المعرّفات الصحيحة → حوّلوها باستخدام
(int) - العلامات → استخدموا
strip_tags()لتصفية العلامات المسموح بها
الأسئلة الشائعة
هل درس «تنقية إدخال المستخدم» مجاني؟
نعم — نص درس «تنقية إدخال المستخدم» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.
ماذا ستتعلم في «تنقية إدخال المستخدم»؟
أزيلوا الأحرف الخطرة باستخدام htmlspecialchars وfilter_input تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟
لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تنقية إدخال المستخدم»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟
نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- GET مقابل POST: متى تستخدمون كلًّا منهما
- قراءة بيانات النماذج باستخدام المتغيرات العامة الفائقة
- تقنيات التحقق من صحة الإدخال
- تنقية إدخال المستخدم