كنت أجري محادثة غير رسمية في ذلك اليوم مع صديق يعمل في مجال التكنولوجيا في شركة ناشئة ناجحة، وبينما كنا نشاهد المباراة النهائية لكرة الماء للسيدات في الألعاب الأولمبية، بدأنا نتحدث عن فشل PHP الذي وجدته في البرية ؟. نظرًا لكونه قائدًا تقنيًا وأنا في منتصف التطوير، كنت أتوقع منه أن يعالج هذا الفشل بالفعل في حياته اليومية، ولكن حسنًا... من المفاجئ أنه يبدو أنه لم يفعل ذلك.
إن "الفشل" الذي أتحدث عنه، وربما تكون قد خمنته بالفعل، ليس سوى مقارنة فضفاضة لـ PHP. الآن، لكي أكون منصفًا، لا يمكنني أن أسميها فشلًا كبيرًا، ولكنها ميزة، لكن استخدامها يمكن أن يكون خطيرًا جدًا، وبهذا المعنى، فهو فشل! هيا بنا نتعرف على الطالب الذي يذاكر كثيرا!
المقارنة الفضفاضة في PHP هي عندما تقارن قيمتين باستخدام عامل التشغيل ==، والذي لا يتحقق من أنواع بيانات المتغيرات الجاري مقارنتها. سيحاول PHP تحويل القيم إلى نوع شائع قبل مقارنتها.
if ('string' == true){ echo 'Weedle I choose you'; } else{ echo 'Charizard I choose you'; }
صدق أو لا تصدق، نحن على وشك إرسال Weedle من 3 مستويات إلى المعركة هنا، بينما يظل Charizard الخاص بنا غير مستخدم. لماذا؟ حسنًا، في المثال أعلاه، تقوم PHP بتحويل السلسلة "string" إلى true قبل مقارنتها بـ true، مما يؤدي إلى مقارنة حقيقية؟. هذا السلوك، رغم أنه مفيد في بعض الأحيان، إلا أنه قد يكون خطيرًا إذا لم يتم فهمه والسيطرة عليه بشكل صحيح.
راجع جدول المقارنات الفضفاضة هذا من مستندات PHP لمزيد من المعلومات
قد لا يبدو الأمر كثيرًا في البداية، لكن ثق بي في أعين المطورين المدربين، قد ترسل هذه الخدعة فجأة ارتعاشًا إلى عظامهم وترسلهم إلى فورة إعادة بناء كود الإنتاج.
في هذا القسم من المقالة، سأحاول تقديم بعض كتل التعليمات البرمجية التي عند العثور عليها في البرية يمكن أن تمنحك مكافأة كبيرة على الأخطاء، وأيضًا إذا وجدت أي شيء مشابه عن بعد لقاعدة التعليمات البرمجية الخاصة بك... قم بتغييره ?
في المقتطف أدناه، ترى منطق نظام تسجيل الدخول الأساسي للغاية.
$username = $_POST['username']; $password = $_POST['password']; if ($username == 'admin' && $password == '12345') { // Grant access }
لنفترض أن أحد المتسللين الماكرين يعبث بالبيانات المرسلة ويجعلها: $_POST['username'] = true و $_POST['password'] = true مما سيؤدي إلى:
$username = $_POST['username']; $password = $_POST['password']; if (true == 'admin' && true == '12345') { // Grant access } # Now that hacker has been granted access to our App... Good for him, not for us
إذا كنت تتساءل كيف يمكن للمتسلل التلاعب ببياناتنا، فلدي إجابتين لك من أعلى رأسي:
المضي قدما.
هنا أعرض مشكلة في PHP قد تصدمك.
$user_role = $_POST['user_role']; // Example: 'admin', 'editor', 'viewer' // Authorization check using a switch statement switch ($user_role) { case 'crazyDifficultAdminRoleNooneWouldEverGuess': // Admin privileges echo "Access granted: Super Admin level"; break; case 'editor': // Editor privileges echo "Access granted: Editor level"; break; case 'viewer': // Viewer privileges echo "Access granted: Viewer level"; break; default: // No access echo "Access denied: Invalid role"; break; }
هذا الرمز معرض بالفعل للتلاعب بالبيانات حيث يمكن للمتسللين تخمين الأدوار وتغيير أدوارهم للوصول إلى مستويات مختلفة من الترخيص.
ومع ذلك، قد نشعر ببعض الأمان، لأنهم لن يتمكنوا أبدًا من تخمين اسم دور المشرف المتميز.
ولكن ماذا لو لم يكن عليهم التخمين على الإطلاق؟☠️
هل تعلم أن Switch Case يستخدم مقارنة فضفاضة؟ ها! قد تصاب بالصدمة الآن!
هذا يعني أنه إذا أضاف المتسلل $_POST['user_role'] = true، فسوف يصل إلى الحالة الأولى في بيان التبديل الخاص بنا بغض النظر عن القيمة. أليس هذا الألم في القاع؟ اقرأ المستندات.
يعد التخفيف من خطأ المقارنة غير الدقيق أمرًا بالغ الأهمية لضمان أمان وموثوقية تطبيقات PHP الخاصة بك. يلعب استخدام المقارنة الصارمة === وتعبير المطابقة، في إصدارات PHP 8.0، دورًا حيويًا في هذه العملية. على عكس عامل المقارنة الفضفاض ==، الذي يمكن أن يؤدي إلى نتائج غير متوقعة وربما خطيرة بسبب تلاعب النوع في PHP، تضمن المقارنة الصارمة التحقق من قيمة ونوع المتغيرات. يؤدي هذا إلى التخلص من نقاط الضعف مثل الإكراه غير المقصود، والذي يمكن استغلاله لتجاوز عمليات التحقق الأمني.
إليك حل لخطأ التفويض غير الآمن باستخدام تعبير المطابقة:
$user_role = $_POST['role']; $response = match ($user_role) { 'crazyDifficultAdminRoleNooneWouldEverGuess' => "Access granted: Super Admin level", 'editor' => "Access granted: Editor level", 'viewer' => "Access granted: Viewer level", default => "Access denied: Invalid role", }; echo $response; # This outputs: 'Access denied: Invalid role' when role is set to true
هل تعلم عن مخاطر المقارنة الفضفاضة والتلاعب بالكتابة في PHP؟ إذا لم تفعل ذلك، فأنت تفعل الآن. دع هذه المقالة البسيطة بمثابة تذكير لقراءة الوثائق دائمًا وتطوير فهم قوي لكل ما تستخدمه عند البرمجة. الفضول هو المفتاح عندما تسعى جاهدة لتصبح الأفضل في كل ما تفعله!
من خلال تبني الانضباط الصارم لـ === والدقة الفائقة للمطابقة، يمكنك الاحتفاظ بكود PHP الخاص بك تحت قيود مشددة، مما يضمن أنه يعمل تمامًا كما تتوقع. تذكر أن القليل من الصرامة الآن يمكن أن يوفر عليك الكثير من الصداع لاحقًا. اجعل هذا بمثابة تنبيه مرح أنه بغض النظر عن مكان وجودك في رحلة البرمجة، فهناك دائمًا شيء جديد لتتعلمه. لذا، أبقِ أعينك مفتوحة، وابقَ فضوليًا، ولا تدع تلك المقارنات السائبة تفلت من الشبكة! ?
يمكنك معرفة المزيد عني في مساحة مدونتي الشخصية على sudorealm.com.
إذا أعجبك أسلوبي في الكتابة والمحتوى الخاص بي، فلا تتردد في الضغط على زر المتابعة، وستحدث أشياء سحرية! ؟؟
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3