وظيفة أمان PHP: strip_tags وfilter_var وMd5 وsha1

⚡ ملخص ذكي

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

  • 🛡️ تعرّف على التهديدات: تتمثل المخاطر الرئيسية في حقن SQL، والبرمجة النصية عبر المواقع، وحقن التعليمات البرمجية، والتي عادةً ما يتم إيصالها من خلال النماذج أو URL المعلمات.
  • 🧹 ملصقات الشريط: تقوم دالة strip_tags بإزالة HTML، Javaيتم استخراج البرامج النصية وعلامات PHP من المدخلات، مما يقلل من خطر تخزين البرامج النصية عبر المواقع.
  • ✅ التحقق من صحة المدخلات: تقوم الدالة filter_var بالتحقق من صحة البيانات وتنظيفها، والتأكد من أن القيمة هي من النوع المتوقع قبل أن يثق بها الكود الخاص بك.
  • 🔒 الهروب أو التقييد: تقوم الدالة mysqli_real_escape_string بتشفير مدخلات الاستعلام، لكن العبارات المُجهزة ذات المعاملات هي الدفاع الأقوى ضد حقن SQL.
  • 🔑 تشفير كلمات المرور بشكل صحيح: لا تقم بتخزين كلمات المرور باستخدام MD5 أو SHA1؛ استخدم password_hash و password_verify، اللذان يطبقان تجزئة bcrypt البطيئة والمملحة.
  • ؟؟؟؟ الدفاع في العمق: دمج التحقق، escaping، HTTPS، وحسابات قواعد البيانات ذات الامتيازات الأقل بدلاً من الاعتماد على عنصر تحكم واحد.
  • 🤖 مساعدة الذكاء الاصطناعي: يمكن لأدوات الذكاء الاصطناعي تدقيق كود PHP بحثًا عن الثغرات الأمنية والمساعدة في إصلاح نقاط الضعف الناتجة عن حقن SQL أو XSS بشكل آمن.

أمان PHP

التهديدات الأمنية المحتملة

هناك فئتان أساسيتان من الأشخاص الذين يمكنهم مهاجمة نظامك:

  • المتسللون – بقصد الوصول إلى البيانات غير المصرح بها أو تعطيل التطبيق
  • قد يقوم المستخدمون - عن غير قصد - بإدخال معلمات خاطئة في النماذج، مما قد يكون له آثار سلبية على موقع الويب أو تطبيق الويب.

وفيما يلي أنواع الهجمات التي يتعين علينا الحذر منها.

حقن SQL – يقوم هذا النوع من الهجمات بإضافة رمز ضار إلى SQL صياغات.

يتم ذلك باستخدام نماذج إدخال المستخدم أو URLالتي تستخدم المتغيرات.

يقوم الكود المرفق بتعطيل الشرط في جملة WHERE في عبارة SQL. كما يمكن للكود المرفق أيضًا:

  • أدخل شرطًا سيكون صحيحًا دائمًا
  • حذف البيانات من الجدول
  • تحديث البيانات في جدول

عادةً ما يُستخدم هذا النوع من الهجوم للوصول غير المصرح به إلى أحد التطبيقات.

البرمجة النصية عبر المواقع (XSS) – يقوم هذا النوع من الهجمات بإدخال شفرة ضارة، عادةً Javaيتم ذلك باستخدام نماذج إدخال المستخدم مثل نماذج "اتصل بنا" و"التعليقات". ويتم ذلك من أجل:

تشمل التهديدات الأخرى حقن كود 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

PHP strip_tags

لنفترض أنك تلقيت ما يلي كمدخلات من المستخدم: 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

PHP strip_tags

لنقم الآن بتأمين تطبيقنا من مثل هذه الهجمات باستخدام وظيفة strip_tags.

<?php
 
$user_input = "<script>alert(0);</script>";
 
echo strip_tags($user_input);
 
?>

استعرض للوصول إلى URL http://localhost/phptuts/comments.php

PHP strip_tags

وظيفة 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.

PHP Md5 وPHP sha1

هام: 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.

الأسئلة الشائعة

استخدم العبارات المُجهزة ذات المعاملات المُرتبطة في mysqli أو PDO. فهي تُرسل الاستعلام والبيانات بشكل منفصل، لذا لا يُمكن لمُدخلات المُستخدم تغيير بنية الاستعلام. وهذا أقوى من التجاوز اليدوي.ping إدخال.

تزيل دالة strip_tags وسوم HTML وPHP بالكامل، بينما تحوّل دالة htmlspecialchars هذه الوسوم إلى كيانات آمنة بحيث تُعرض كنص. للحصول على مخرجات escaping ضد هجمات XSS، يعتبر استخدام htmlspecialchars عادةً الخيار الأكثر أمانًا.

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

نعم. يمكن للذكاء الاصطناعي فحص الثغرات الأمنية مثل حقن SQL، وهجمات XSS، وتجزئة كلمات المرور غير الآمنة، ومعالجة الملفات غير الآمنة، ثم شرح كل خطر واقتراح حلول له. اعتبره فحصًا أوليًا مفيدًا، وليس بديلًا عن مراجعة أمنية شاملة.

نعم. الصق الكود المعرض للثغرات، وسيتمكن الذكاء الاصطناعي من إعادة كتابته باستخدام عبارات مُعدة مسبقًا، ثم يُخرج مخرجًا.pingوالتحقق من صحة المدخلات. اختبر الكود المصحح وتأكد من صحة الإصلاح مقارنةً بمدخلات الهجوم الأصلية.

تلخيص هذه التدوينة بـ: