لمحة جافاوية 10:ثغرة الحقن

السلام عليكم

في اليومين السابقين
قررت أني يجب أن أكون شريراً
وأتعلم كيف اخترق موقع ابن عمة صلاح
بالطبع كعادتي بعد أن تعلمت أبسط المبادئ
أصبت بالملل
على العموم يبدو أنكم محظوظون لأني سأعلمكم أشهر ثغرة في عالم الاختراق
هذه ثغرة مشهورة جداً يعرفها أصغر مخترق في العالم
نسمى ثغرة بالحقن SQL Injection
وسميتها بثغرة الحقن
لأنك تقوم بحقن جملة SQL بجملة SQL أخرى أو بشرط يدخل في الجملة الحالية
قبل ما نبدأ ونشرحلكم الثغرة
في رموز خاصة في جملة SQL
بمعنى أن وجودها في الجملة يعطي معنى معين
منها:
‘ وهي رمز لبداية ونهاية الجملة String
— تعني أن أي كلام بعدها لا يدخل في عملية الترجمة إلى نهاية السطر الحالي
الثغرة تعتدم على الحروف السابقة
لاحظوا معي الشيفرة التالية

Statement stmt = connection.createStatement();
stmt.execute("Select * from Customer where CustomerID ='"+theme+"'");
stmt.close();

كل شيء جيد ويعمل
لكن في الوضع الطبيعي
أما بالنسبة للوضع غير الطبيعي خذ هذا المثال
ماذا لو جاء المستخدم ووضع العلامة a’laa سنجد أنه أغلق جملة SQL
لو فرضنا حسن النية
فسنحصل على خطأ في SQLException
لأن الجملة أصبحت بالشكل التالي

Select * from Customer where CustomerID ='a'laa'

بالتالي مدير قاعدة البيانات سيجد أن الجملة خاطئة

ماذا عن سوء النية
خذا هذا المثال
مستخدم أدخل التالي
a’–anything
لاحظ معي ما الذي قام بعمله

Select * from Customer where CustomerID =a'--anything'

بالتالي استطاع المستخدم التخلص من المشكلة التي كانت تواجهه
وذلك بجعل باقي النص كتعليق
حتى الآن لا يوجد أية مشاكل لأن الجملة لن ترجع أي شيء
المشكلة تبدأ عند السيناريو التالي

Select * from Customer where CustomerID =a'or '1'='1'--anything'

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

هذا مثالنا السابق نفسه لكن استبدلنا Statement بـ PreparedStatement

final String sql = "Select * from Customer where CustomerID =?";//1
final PreparedStatement ps = connection.prepareStatement(sql);

ps.setString(1,customerID);//3

ps.close();

ستقوم الجملة رقم 3 بتزويد الجملة رقم 1 بالقيمة في مكان علامة الاستفهام
على هيئة VARCHAR أو LONGVARCHAR على حسب طولها
فعلياً الفئة PreparedStatement تقوم بعدة عمليات على المدخلات لكي تضمن لك ذلك
فتأخذ وقت زائد في التنفيذ
لهذا ينصح أن تقوم باستخدام Statement
إلا في الحالات التي تستدعي أخذ معلومات من المستخدم

الله معكم

Tags: , , , , , , , , ,

6 Responses to “لمحة جافاوية 10:ثغرة الحقن”

  1. Salam قال:

    بارك الله فيك أخي علاء ..
    جمل بسيطة قد يغفل عنها المبرمج .. فتحدث الكارثة ..
    قبل يومين ناقشنا مشروع لمساق تطلب منا ربط الجافا مع قواعد البيانات ..
    وقد استخدمنا فيها PreparedStatement ..
    جميل ان يطبق المرء ما يتعلمه ..

    تحياتي أخ علاء ..

  2. admin قال:

    الحمد لله
    كنت فقدت الأمل في أن أجد
    أحداً استفاد مما أخترف به
    بداية جيدة
    بالنسبة لي طبعاً :)
    شكراً سلام
    أتمنى لك التوفيق دوماً
    تحياتي

  3. abuoof قال:

    جزاك الله خير
    مع أني أعرفها منذ عدة أشهر كنت بشرح jdbcفي التدريب الصيفي وأخرجت جميع الفروق بين PreparedStatement و Statement إلا هذا الفرق فقام الليدر بشرحه لنا
    دمتم في رعاية الله

  4. admin قال:

    لو عندك أشياء أخرى تعرفها عن هذا الموضوع
    يسعدني أن أستمع إليها
    سواءاً هنا أو في المنتدى أو في مدونتك

    تحياتي

Leave a Reply