أخطاء المبرمجين الأمنية فى PHP, الدرس السادس (6)

Spread the love
 أخطاء المبرمجين الأمنية فى PHP, الدرس السادس (6)  أضيف في: 12-5-1427هـ
أخطاء المبرمجين الأمنية فى PHP, الدرس السادس (6)

9- تابع أخطاء جمل إستعلام SQL

دائماً ما تستخدم المدخلات فى جملة الإستعلام كمعاملات إذا كان المستخدم ذو خبرة فسوف يستطيع إستخدام هذه المعاملات أيضاً كما ذكرنا سابقاً بضعة أمثلة بإستخدام GET سوف نستخدم POST فى هذا المثال:

CODE


$query = “SELECT id, name FROM `records` LIMIT ”
. $_POST[‘NUM’];
$result = $db->select($query);

و عند إستخدام الشفرة التالية:

CODE


<form action=”form.php” method=”POST”>
<input type=”text” name=”NUM”
value=”5; DELETE FROM `records`”>
<input type=”submit”>
</form>

تصبح جملة الإستعلام كالآتى:

CODE


SELECT id, name FROM `records` LIMIT 5;
DELETE FROM `records`

و لقد رأيت برامج كثيرة غير محمية على الإطلاق من مثل هذا النوع من الهجمات عن طريق معاملات جمل الإستعلام و إليك هذه الدالة البسيطة لتنقيح جمل الإستعلام و بالتالى تفادى بعض من تلك الهجمات:

CODE


function filter_sql($input) {
$reg = “(delete)|(update)|(union)|(insert)”;
return(eregi_replace($reg, “”, $input));
}

10- أخطاء البرمجة المتقاطعة Cross-Site Scripting XSS

من الأخطاء الشائعة إستخدام البرمجة المتقاطعة(XSS) و هى تقنية مستخدمة بكثرة لإضفاء مزيد من الديناميكة لمستخدم الموقع بالنسبة للتحكم فى واجهات التصميم و البيانات و كيفية عرضها ، و الحقيقة أن الأخطاء ليست مع PHP فقط و إنما مع أى لغة تستخدم هذه التقنية من خلالها و قد يكون مسار إستخدام وسوم HTML و Javascript هو الشائع من خلال النماذج FORMS مما يعكس أهمية أن تكون البيانات المدخلة منقحة تماماً سواء كانت المدخلات من المستخدم أو من موقع آخر أو حتى من قاعدة البيانات ، و كمثال:

CODE


$note = $_GET[“note”];
If ($note) {
echo $note;
}

يستطيع المستخدم تنفيذ الشفرة التالية من خلال شريط العنوان فى المتصفح:

CODE


Page.php?note=<script>alert(“pop up”);</script>

هذا مثال بسيط على إمكانية إرجاع وسوم HTML و Javascript إلى المستعرض و سوف تؤثر بطبيعة الحال و اللغات المستخدمة على متصفح العميل و لكن… إذا تم تخزين $note و عرضها لاحقاً لمستخدمين آخرين فسوف تكون النتيجة سيئة للغاية و يستطيع المهاجم مثلاً إدخال شفرة Javascript لتحويل مستخدمى الصفحة إلى صفحة أخرى أو عمل عدد لا نهائى من الرسائل pop up (و للأمانة العلمية هناك أشياء لم و لن أذكرها حتى لا يستخدم هذا المقال فى أذى الناس) و الحل فى تخطى وسمى < > كما فى المثال التالى:

CODE


$escapeChars[0] = array(‘<‘, ‘>’);
$escapeChars[1] = array(“<“, “>”);
$note = str_replace($escapeChars[0],$escapeChars[1],$_GET[“note”]);

و لإزالة الوسوم:

CODE


$escapeChars[0] = array(‘<‘, ‘>’);
$note = str_replace($escapeChars[0], “”, $_GET[“note”]);

هناك حلاً أعم قليلاً مما سبق لمنع هذه النوعية من الهجوم و هو إستخدام دالة htmlentities() .

11- طرق تدفق البيانات

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

– ملف index.php يوضع وحيداً فى الدليل الجذرى Root.
– ملفات التوصيف الخطرة مثل Config توضع فى دليل و ليكن إسمه على سبيل المثال /lib/.
– ملفات القوالب توضع فى مجلد يسمى على سبيل المثال /tpl/ و يتم حماية المجلد بإستخدام ملف .htaccess.
– ملفات الفئات Classes توضع فى مجلد إسمه مثلاً /classes/ و يتم حماية المجلد بإستخدام ملف .htaccess.
– ملفات الصور مثلاً فى مجلد /images/.
– إذا كنت تستخدم ملفات فلاش بتقنية ActionScript إستعمل لها مجلداً خاصاً و ليكن إسمه /flashscr/.

بعد أن قمنا بعمل المخطط الشجرى إتبع الخطوات التالية:

– ضع كل إستعلامات المستخدم فى ملف index.php بدون معاملات parameters مما يخلق لدينا حاجزاً ذو ذاكرة مؤقتة لتمرير البيانات إلى ملف الفئة الرئيسى الذى بدوره يعرض البيانات فى ملف القوالب.
– إجعل مدخلات النماذج FORMS بواسطة المستخدم تحول مخرجاتها إلى ملف الفئة لوظائف المستخدم على الهيئة التالية: ?class=account&action;=login مما يجعل النموذج مجرد واجهة ربط و ملف الفئة لوظائف المستخدم هو ما يقوم بالإستعلام.
– إجعل البيانات العائدة من قاعدة البيانات بناءً على المدخلات من المستخدم تمر أولاً على ملف الفئة لتكوين عمليات الجلسات ثم إرسالها للعرض عن طريق ملف الفئة للقوالب و التعديل فى نفس الحاجز ذو الذاكرة المؤقتة لملف index.php.

index.php
|
|— ملف الفئة الرئيسى
|
|— إدارة المحتويات
|— التسجيل
|— الأخبار
|— حساب المستخدم
|— القوالب
|
|———–|
|
|— مكتبة الدوال
|— فئة.الإدارة
|— فئة.التسجيل
|— فئة.الأخبار
|— فئة.المستخدم
|
||— فئة.القوالب
||
||— نظام الملفات
|
|— قاعدة البيانات

و للوهلة الأولى يبدو هذا الكلام عن طرق تدفق البيانات صعب و غير واضح و فى الحقيقة هو بسيط إذا وضعت فى إعتبارك المميزات التالية:

– تحويل أسرع للبيانات المدخلة (أياً كان نوعها) من قبل المستخدم مع تنقيح للبيانات عن طريق طبقة ملف الفئة الرئيسى.
– تحليل و رصد شامل للأخطاء عن طريق طبقة ملف الفئة الرئيسى.
– كل ملف من ملفات الفئات يحمل خوصه الذاتية لتنقيح جميع أنواع البيانات المدخلة و المخرجة مع حماية فى الطبقة العليا أى ملف الفئة الرئيسى.

أخيراً لا تعتقد أن ذلك هو الحل الأمثل فبإستطاعتك إيجاد طرق لتدفق البيانات أسهل و أكثر فعالية فقط بإعمال عقلك جيداً.

الكاتب: هاني جمال

الكاتب geek4arab

geek4arab

مواضيع متعلقة

التعليقات مغلقة