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


الدرس :-


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

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

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



CODE


كود:
$id = $_GET["id"];
$result = mysql_query("SELECT * FROM `articles` where id=$id;");






و بما أنه لم يتم التأكد من المتغير $id فإذا قام المستخدم بناءً على ما سبق بإدخال الجملة التالية فى شريط العنوان بالمتصفح –




CODE


كود:
Page.php?id=0 UNION SELECT * FROM `admin_users`







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




CODE
كود:


SELECT * FROM `articles` WHERE id=0 
UNION SELECT * FROM `admin_users`;








مما سوف تكون نتيجته إظهار كل محتويات الجدول `admin_users` و هى بيانات من المفترض أنها غير متاحة ، و الحل بما أن المتغير $id هو رقم إذن ينبغى التأكد من أنه رقم (فقط) و هناك طريقتين أرجح إستخدام ثانيهما ، أما الأولى فهى التأكد بإستخدام دالة intval ليصبح:




CODE


كود:
$id = intval($_GET["id"]);







أما الطريقة الثانية و المفضلة فى رأيى:



CODE

كود:
$id = $_GET["id"];
If (!is_numeric($id)) {
………………….echo "foot bokra"
} else {
………………….continue
}





و كمثال آخر و لكن المتغير عبارة عن نص:




CODE

كود:
$name = $_GET["name"];
$result = mysql_query("SELECT * FROM `articles` 
WHERE title="$name";");






و بما أنه لم يتم التأكد من المتغير $name فإذا قام المستخدم بناءً على ما سبق بإدخال الجملة التالية فى شريط العنوان بالمتصفح -




CODE
كود:


Page.php?name= UNION SELECT * FROM `admin_users` 
WHERE name="%






سوف تكون النتيجةإظهار كل محتويات الجدول `admin_users` و المفترض أنها غير متاحة و الحل بما أن المتغير $name هو متغير نصى إذن ينبغى التأكد أن المتغير المدخل $name يحتوى على نص (فقط) و هناك طريقتان للتحقق من أن المدخل نص (فقط) و إنهاء جملة الإستعلام ، أما الطريقة الأولى فهى:




CODE


كود:
$name = str_replace(""", """, $_GET["name"]);







أما الطريقة الثانية فهى كالآتى:




CODE


كود:
$name = str_replace(""", "\"", $_GET["name"]);