PHP هي لغة رائعة لتطوير الويب ولغة مرنة، ولكننا نرى بعض الأخطاء التي يرتكبها مبرمجو PHP مرارًا وتكرارًا. لقد قمت بإعداد القائمة التالية التي تضم 10 أخطاء شائعة يرتكبها مبرمجو PHP، ومعظمها يتعلق بالأمان. تعرف على نوع الأخطاء التي ارتكبتها:
1. لا تتجاهل كيانات html
المنطق السليم الأساسي: يجب تغيير جميع المدخلات غير الموثوقة (خاصة البيانات المقدمة من المستخدمين من النماذج) قبل الإخراج.
صدى $_GET['usename'] ;
هذا المثال قد يخرج:
<script>/*برنامج نصي لتغيير كلمة مرور المسؤول أو تعيين ملف تعريف الارتباط*/</script>
يعد هذا خطرًا أمنيًا واضحًا ما لم تتأكد من أن المستخدمين يكتبون بشكل صحيح.
كيفية الإصلاح:
نحتاج إلى تحويل "<"، و">"، و"و"، وما إلى ذلك إلى تمثيل HTML صحيح (<، >'، و "). تقوم الدالتان htmlspecialchars و htmlentities() بهذا بالضبط.
الطريقة الصحيحة: echo htmlspecialchars ( $_GET['username'], ENT_QUOTES);
2. لا تتجاهل إدخال SQL لقد ناقشت هذه المشكلة ذات مرة في مقال "أبسط طريقة لمنع حقن SQL" (php+mysql) وأعطاني أحدهم طريقة بسيطة لقد تم ضبط علامات الاقتباس السحرية بالفعل على تشغيل في php.ini لذا لا داعي للقلق بشأن ذلك، ولكن لا تأتي جميع المدخلات من $_GET أو $_POST أو $_COOKIE
كيفية إصلاح ذلك!
كما هو الحال في أبسط طريقة لمنع حقن SQL (php+mysql)، ما زلت أوصي
بالطريقة الصحيحة لاستخدام الدالة mysql_real_escape_string() :
<?php
$sql = "مجموعة تحديث المستخدمين
name='.mysql_real_escape_string($name).'
أين المعرف = '.mysql_real_escape_string ($id).'";
mysql_query($sql);
?>
3. الاستخدام الخاطئ للوظائف المرتبطة برأس HTTP: header(), session_start(), setcookie()
هل واجهت هذا التحذير من قبل؟" تحذير: لا يمكن إضافة معلومات الرأس - تم إرسال الرؤوس بالفعل [....]
في كل مرة يتم فيها تنزيل صفحة ويب من الخادم، ينقسم إخراج الخادم إلى جزأين: الرؤوس والنص الأساسي.
يحتوي الرأس على بعض البيانات غير المرئية، مثل ملفات تعريف الارتباط. يصل الرأس دائمًا أولاً. يتضمن جزء النص HTML المرئي والصور والبيانات الأخرى.
إذا تم ضبط Output_buffering على Off، فيجب استدعاء جميع الوظائف المرتبطة برأس HTTP قبل أن يكون هناك إخراج. تكمن المشكلة في أنه عند التطوير في بيئة ما والنشر في بيئة أخرى، قد تكون إعدادات Output_Buffering مختلفة. ونتيجة لذلك، توقفت عملية إعادة التوجيه، ولم يتم تعيين ملف تعريف الارتباط والجلسة بشكل صحيح...
كيفية الإصلاح:
تأكد من استدعاء الوظائف ذات الصلة برأس http قبل الإخراج، وقم بتعيين input_buffering = Off
.
4. اشتراط أو تضمين ملفات تستخدم بيانات غير آمنة مرة أخرى: لا تثق في البيانات التي لم تعلن عنها صراحةً. لا تقم بتضمين أو طلب الملفات التي تم الحصول عليها من $_GET أو $_POST أو $_COOKIE.
على سبيل المثال:
Index.php
<؟
// بما في ذلك الرأس والتكوين واتصال قاعدة البيانات وما إلى ذلك
include($_GET['اسم الملف']);
// بما في ذلك التذييل
?>
يمكن لأي متسلل الآن استخدام: http://www.yourdomain.com/index.php?filename=anyfile.txt
للحصول على معلوماتك السرية، أو تنفيذ برنامج PHP النصي.
إذا سمح_url_fopen=تشغيل، فأنت ميت:
جرب هذا الإدخال:
http://www.yourdomain.com/index
. الملفات المحذوفة الخ أي شيء يمكنك تخيله.
كيفية الإصلاح:
يجب عليك التحكم في الملفات التي يمكن تضمينها في التضمين أو طلب التوجيهات.
فيما يلي حل سريع ولكنه غير شامل:
<؟
// تضمين الملفات المسموح بها فقط.
$allowedFiles = array('file1.txt','file2.txt','file3.txt');
إذا(in_array((سلسلة)$_GET['اسم الملف'],$allowedFiles)) {
include($_GET['اسم الملف']);
}
آخر{
خروج('غير مسموح');
}
?>
5. الأخطاء النحوية تشمل الأخطاء النحوية جميع الأخطاء المعجمية والنحوية الشائعة جدًا لدرجة أنني يجب أن أدرجها هنا. الحل هو دراسة بناء جملة PHP بعناية والحرص على عدم تفويت قوس أو قوسين أو فاصلة منقوطة أو علامة اقتباس. ابحث أيضًا عن محرر جيد ولا تستخدم المفكرة!
6. يتم استخدام عدد قليل أو لا يتم استخدام أي مشاريع موجهة للكائنات. العديد من المشاريع لا تستخدم تقنية PHP الموجهة للكائنات، ونتيجة لذلك، تصبح صيانة التعليمات البرمجية تستغرق وقتًا طويلاً وتتطلب عمالة مكثفة. تدعم PHP المزيد والمزيد من التقنيات الموجهة للكائنات وهي تتحسن باستمرار. لا يوجد سبب يمنعنا من استخدام التقنيات الموجهة للكائنات.
7. عدم استخدام الإطار
95% من مشاريع PHP تقوم بنفس الأشياء الأربعة: الإنشاء والتحرير والإدراج والحذف. يوجد الآن العديد من أطر عمل MVC لمساعدتنا في إكمال هذه الأشياء الأربعة، لماذا لا نستخدمها؟
8. لست على علم بالوظائف المتوفرة بالفعل في PHP
يحتوي جوهر PHP على العديد من الوظائف. يقوم العديد من المبرمجين بإعادة اختراع العجلة مرارًا وتكرارًا. ضاع الكثير من الوقت. قبل البرمجة، ابحث عن PHP mamual وابحث في جوجل، قد تجد اكتشافات جديدة! تعد exec() في PHP وظيفة قوية يمكنها تنفيذ cmd shell وإرجاع السطر الأخير من نتيجة التنفيذ في شكل سلسلة. لأسباب أمنية، يمكنك استخدام EscapeShellCmd()
9. استخدم إصدارًا أقدم من PHP
لا يزال العديد من المبرمجين يستخدمون PHP4. لا يمكن للتطوير على PHP4 إطلاق العنان لإمكانيات PHP، ولا تزال هناك بعض المخاطر الأمنية. قم بالتبديل إلى PHP5، فهو لا يتطلب الكثير من الجهد. يمكن ترحيل معظم برامج PHP4 إلى PHP5 مع تغييرات قليلة أو حتى بدون تغييرات على البيانات. وفقًا لاستطلاع أجراه http://www.nexen.net، فإن 12% فقط من خوادم PHP تستخدم PHP5، لذلك لا يزال 88% من مطوري PHP يستخدمون PHP4.
قم بتغيير علامات الاقتباس مرتين أو تظهر في الويب page '"؟ يرجع هذا عادةً إلى إيقاف تشغيل magic_quotes في بيئة المطور، ولكن magic_quotes=on على الخادم المنشور. ستقوم PHP بتشغيل addlashes() بشكل متكرر على البيانات الموجودة في GET وPOST وCOOKIE.
النص الأصلي:
إنها عبارة عن
اقتباسات سحرية حول:
إنها سلسلة
تشغيل مرة أخرى
يضيف جلدة ():
إنها سلسلة
إخراج HTML:
إنها سلسلة،
والموقف الآخر هو أن المستخدم يدخل معلومات تسجيل دخول خاطئة في البداية، وبعد أن يكتشف الخادم الإدخال الخاطئ، يقوم بإخراج نفس النموذج ويطلب من المستخدم الإدخال مرة أخرى، مما يتسبب في تغيير إدخال المستخدم مرتين!