بسم الله الرحمن الرحيم
أكثر ما يؤرق المبرمج في برامجه قضية أمن البرنامج، ورغم أن الأمن قضية لا يمكن أن تكون مئة بالمئة، لكن نعمل محاولين أن تكون برامجنا عصية على القراصنة.
سأتحدث وإياكم اليوم عن بعض الأمور التي من شأنها حماية برمجياتنا في PHP من ثغرة خطيرة للغاية تدعى SQL Injection، ثغرة يتمكن من خلالها القرصان أن يدخل قاعدة بياناتك، تعتمد هذه الثغرة على أخطاء في عمليتي GET و POST، وهي في العادة ما نستخدمه.
سنأخذ مثالاً على هذه الثغرة وآلية عملها، وكيف لنا معالجتها.
مثال: لنفرض أن في موقعنا صفحة لعرض بيانات العضو المشترك في موقعنا.. مثل الملف الشخصي
الرابط member.php?id=6
من المتوقع أن يكون الكود:
كود PHP:
$id = $_GET['id']
$row= mysql_query('select * from `members` where id=$id');
لكن هل هذه الصيغة صحيحة؟!! بالطبع لا، بل ستكون كارثة عليك، ستمكن القرصان من إستخدام جملة UNION SELECT
بذلك ستكون الثغرة بهذا الشكل:
member.php?id=’ UNION SELECT concat(username,char(58),password) FROM members
وبذلك سيتمكن من عرض كلمة المرور password، حينها سيكون موقعك بين أنامل ولوحة مفاتيح هذا القرصان.
لذلك كيف لي أن أوقف هذا الهجوم المتوقع؟
هناك عدة أساليب وطرق، سنستخدم منها واحدة
سنفحص إن كانت GET عبارة عن رقم أو لا، وذلك بإستخدام دالة isnumeric.
سيكون الكود الصحيح:
كود PHP:
$id = $_GET['id'];
if(!isnumeric($id)) { die("No SQL Injection"); }
$row= mysql_query('select * from `members` where id=$id');
الآن لو حاولت تطبيق الثغرة السابقة، ستكون النتيجة على الشاشة:
No SQL Injection
لكن يا MPHP أنا في بحثي أستخدم كلمات String وليس أحرف، إذاً طريقتك هذه لا تفيدني في عمليات البحث !!
صحيح كلامتك، إذا في هذه حالة، نستخدم دالة mysql_real_escape_string
حيث سيكون الكود:
كود PHP:
$id = mysql_real_escape_string($_GET['id']);
الآن حاول تطبيق الثغرات بعد كتابة الكود الصحيح، وإن شاء الله ستجد هذه الثغرة قد قضي عليها.
أخوكم
MPHP
المصدر الأجنبي
http://icrack.co.uk/?p=10