وظيفة أمان PHP: strip_tags وfilter_var وMd5 وsha1
⚡ ملخص ذكي
يحمي نظام أمان PHP تطبيقات الويب من الهجمات والمدخلات غير الدقيقة من خلال التحقق من صحة البيانات وتنظيفها وتخزينها بأمان. يشرح هذا الدليل التهديدات الرئيسية، ثم يعرض وظائف strip_tags و filter_var و esca.ping، وتجزئة كلمات المرور الحديثة باستخدام password_hash للحماية من هجمات XSS وحقن SQL وبيانات الاعتماد المسروقة.

التهديدات الأمنية المحتملة
هناك فئتان أساسيتان من الأشخاص الذين يمكنهم مهاجمة نظامك:
- المتسللون – بقصد الوصول إلى البيانات غير المصرح بها أو تعطيل التطبيق
- قد يقوم المستخدمون - عن غير قصد - بإدخال معلمات خاطئة في النماذج، مما قد يكون له آثار سلبية على موقع الويب أو تطبيق الويب.
وفيما يلي أنواع الهجمات التي يتعين علينا الحذر منها.
حقن SQL – يقوم هذا النوع من الهجمات بإضافة رمز ضار إلى SQL صياغات.
يتم ذلك باستخدام نماذج إدخال المستخدم أو URLالتي تستخدم المتغيرات.
يقوم الكود المرفق بتعطيل الشرط في جملة WHERE في عبارة SQL. كما يمكن للكود المرفق أيضًا:
- أدخل شرطًا سيكون صحيحًا دائمًا
- حذف البيانات من الجدول
- تحديث البيانات في جدول
عادةً ما يُستخدم هذا النوع من الهجوم للوصول غير المصرح به إلى أحد التطبيقات.
البرمجة النصية عبر المواقع (XSS) – يقوم هذا النوع من الهجمات بإدخال شفرة ضارة، عادةً Javaيتم ذلك باستخدام نماذج إدخال المستخدم مثل نماذج "اتصل بنا" و"التعليقات". ويتم ذلك من أجل:
- استرجاع المعلومات الحساسة مثل بيانات ملفات تعريف الارتباط
- أعد توجيه المستخدم إلى صفحة مختلفة URL.
تشمل التهديدات الأخرى حقن كود PHP، وحقن shell، وحقن البريد الإلكتروني، والكشف عن كود المصدر للبرامج النصية.
ممارسات أفضل لأمن تطبيقات PHP
دعونا الآن نلقي نظرة على بعض أفضل ممارسات أمان PHP التي يجب علينا مراعاتها عند التطويرping تطبيقاتنا.
PHP strip_tags
تقوم الدالة strip_tags بإزالة HTML، Javaسيناريوأو علامات PHP من سلسلة نصية.
تُعد هذه الوظيفة مفيدة عندما يتعين علينا حماية تطبيقنا من هجمات مثل البرمجة النصية عبر المواقع.
لنفترض تطبيقًا يقبل التعليقات من المستخدمين.
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
بافتراض أنك قمت بحفظ ملف comments.php في مجلد phptuts، انتقل إلى URL http://localhost/phptuts/comments.php
لنفترض أنك تلقيت ما يلي كمدخلات من المستخدم: alert(‘Your site sucks!’);
<?php $user_input = "<script>alert(0);</script>"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
استعرض للوصول إلى URL http://localhost/phptuts/comments.php
لنقم الآن بتأمين تطبيقنا من مثل هذه الهجمات باستخدام وظيفة strip_tags.
<?php $user_input = "<script>alert(0);</script>"; echo strip_tags($user_input); ?>
استعرض للوصول إلى URL http://localhost/phptuts/comments.php
وظيفة PHP filter_var
يتم استخدام وظيفة filter_var للتحقق من صحة البيانات وتعقيمها.
التحقق من الصحة يتحقق مما إذا كانت البيانات من النوع الصحيح. يؤدي التحقق من الصحة الرقمي على سلسلة إلى إرجاع نتيجة خاطئة.
التعقيم هو إزالة الأحرف غير القانونية من ملف سلسلة.
راجع هذا الرابط للاطلاع على المرجع الكامل: عامل التصفية
الكود أدناه خاص بنظام التعليقات. يستخدم الدالة filter_var والثابت FILTER_SANITIZE_STRIPPED لإزالة الوسوم.
<?php $user_input = "<script>alert(0);</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
الإخراج:
alert('Your site sucks!');
ملاحظة: تم إيقاف استخدام FILTER_SANITIZE_STRIPPED (وهو اسم بديل لـ FILTER_SANITIZE_STRING) بدءًا من PHP 8.1. بالنسبة للتعليمات البرمجية الجديدة، استخدم strip_tags() أو، لعرض آمن، استخدم htmlspecialchars().
PHP mysqli_real_escape_string
تُستخدم دالة mysqli_real_escape_string للمساعدة في حماية التطبيق من هجمات حقن SQL.
لنفترض أن لدينا عبارة SQL التالية للتحقق من صحة اسم المستخدم وكلمة المرور.
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
يمكن لمستخدم خبيث الدخول أو 1 = 1 — أدخل اسم المستخدم في خانة نص المعرّف، وكلمة المرور 1234 في خانة نص كلمة المرور. لنبدأ الآن ببرمجة وحدة المصادقة.
<?php $uid = "0$uid1$pwd';"; echo $sql; ?>
ستكون النتيجة النهائية كالتالي:
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
هنا،
- "WHERE uid = ''" يتحقق من وجود معرف مستخدم فارغ
- "أو 1 = 1" هو شرط سيكون صحيحًا دائمًا
- "–" يعلق على الجزء الذي يختبر كلمة المرور.
ستُعيد الاستعلامات السابقة جميع المستخدمين. لنستخدم الآن دالة mysqli_real_escape_string لتأمين وحدة تسجيل الدخول. لاحظ أن هذه الدالة في الكود الفعلي تأخذ اتصال قاعدة البيانات كمعاملها الأول.
<?php $uid = mysqli_real_escape_string($conn, "0$uid1$pwd';"; echo $sql; ?>
سيُخرج الكود أعلاه ما يلي:
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
ملاحظة: تم وضع علامة اقتباس مفردة ثانية، لذلك سيتم التعامل معها كجزء من معرف المستخدم ولن يتم التعليق على كلمة المرور.
أفضل ممارسة: هيئة الأوراق الماليةping يساعد ذلك، لكن العبارات المُجهزة ذات المعاملات في mysqli أو PDO هي الدفاع الموصى به ضد حقن SQL، لأن البيانات لا تختلط أبدًا بنص الاستعلام.
PHP Md5 وPHP sha1
MD5 هو اختصار لـ Message Digest 5، وSHA1 هو اختصار لـ Secure Hash Algorithm 1. كلاهما وظائف تجزئة أحادية الاتجاه.
يوضح الكود أدناه كيفية تطبيق خوارزميتي md5 و sha1.
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
بافتراض أنك قمت بحفظ الملف hashes.php في مجلد phptuts، انتقل إلى URL.
هام: MD5 و SHA1 عبارة عن تجزئات سريعة وغير مملحة، و لم يعد يعتبر مكانًا آمنًا لتخزين كلمات المرورلأنها قابلة للاختراق بسرعة باستخدام الأجهزة الحديثة وجداول قوس قزح. استخدمها فقط للتحقق من سلامة البيانات غير الأمنية، واستخدم الطريقة الموضحة أدناه لكلمات المرور.
كيفية تشفير كلمات المرور بشكل آمن في لغة PHP
لتخزين كلمات المرور، توفر لغة PHP الدالتين password_hash و password_verify. تستخدم هاتان الدالتان خوارزمية بطيئة مع إضافة قيمة عشوائية (bcrypt افتراضياً)، لذا فإن كل قيمة تجزئة فريدة ومكلفة الاختراق حتى في حالة سرقة قاعدة البيانات.
<?php // Hash a password before storing it in the database $hash = password_hash("mypassword", PASSWORD_DEFAULT); // Verify the password when the user logs in if (password_verify("mypassword", $hash)) { echo "Password is valid"; } else { echo "Invalid password"; } ?>
- كلمة المرور_هاش () يقوم بإنشاء تجزئة ملحية لتخزينها في قاعدة البيانات؛ PASSWORD_DEFAULT يبقيك على الخوارزمية الموصى بها حاليًا.
- password_verify() يقوم بفحص محاولة تسجيل الدخول مقابل التجزئة المخزنة دون فك تشفيرها مطلقًا.
لأن الملح والخوارزمية مخزنة داخل التجزئة، فلن تقوم بإدارتها بنفسك أبدًا، مما يجعل هذه الطريقة الصحيحة والمستقبلية للتعامل مع كلمات المرور في PHP.




