Warning: set_time_limit() [function.set-time-limit]: Cannot set time limit in safe mode in /home/devhall/public_html/init.php on line 3

Warning: Cannot modify header information - headers already sent by (output started at /home/devhall/public_html/init.php:3) in /home/devhall/public_html/includes/classes/class.article.php on line 817
الـ SQL Injection ، سلاح الدمار الشامل ضد تطبيقات الويب
 
 مشاهدة البلوقز   المحررين  سجل كمحرر  دخول المحررين  تسجيل الخروج()  أضف مقالة  مقالاتي
Search     بحث متقدم
 »  الرئيسية  »  أمن المعلومات  »  الـ SQL Injection ، سلاح الدمار الشامل ضد تطبيقات الويب
الـ SQL Injection ، سلاح الدمار الشامل ضد تطبيقات الويب
بواسطة Binary Tree | نُشِر  05/11/2005 | أمن المعلومات | تقييم:
ما هو الـ SQL Injection

يسعى الكثير من مطوري مواقع الويب و تطبيقاتها الى بناء برامج آمنة الى حد كبير ، وذلك بإستخدام العديد من الأساليب البرمجية المتبعة و التي تقدمها كل لغة لحماية مستخدميها ، ولكن هل تلك الدوال المقدمة من لغات البرمجية كافية فعلا لضمان حماية التطبيقات ضد أي إعتداء أو تشويه للبيانات المخزنة ؟

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

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

الـ SQL Injection أو إن صح لنا تعريبه بـ " حقن الـ SQL " ، هو نوع من الهجمات يعتمد على إضافة شيفر SQL الى المتغيرات المررة للنظام ، بحيث يتم تنفيذ هذه الجزئية من الشيفرة مع الشيفرة الأساسية الموجودة في النظام ، لتوضيح الصورة ، سنطرح هذا المثال المكتوب بلغة PHP بإستخدام نظام قواعد البيانات MySQL :


<?
$sql="SELECT * FROM users WHERE username=' " .$_POST['username'] . " '  AND password= ' " . $_POST['password'] . " ' " ;

echo ' Query : '. $sql . '
' ;
$result=mysql_query($sql) ;
$rows=mysql_num_rows($result) ;
if($rows > 0 )
{
    echo " You are logged in ! " ;

}

else

{

    echo " you are not allowed to log in here ! " ;
}

?>

<form action="<?php echo $_SERVER['PHP_SELF'] ; ?> " method="post"><br/><input name="username"/><font color="#990000"> <br/><br/></font><input name="password"/><font color="#990000"> <br/><br/></font><input type="submit" value="Submit"/><br/></form>

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

الأن تخيل لو أن المخترق قام بإدخال التالي في حقل كلمة المرور :

' OR username LIKE '%

بذلك ستصبح جملة الإستعلام في أصل البرنامج بهذا الشكل :

SELECT * FROM users WHERE username=' ' AND password= ' ' OR username LIKE '%'


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

هذا يعني أن المخترق سيتمكن من الوصول الى المنطقة التي لا يمكن الا للأعضاء أن يصلوا اليها !!

أتمنى أن يكون هذا المثال المبسط قد أوضح بشكل كامل ما هو المقصود بالـ SQL Injection و مدى خطورته ، سيتخلل هذه المقالة المزيد من الأمثلة بإذن الله

تعليق
  • تعليق #1 (إضيف من قبل mustafa)
    تقييم
    في البداية مشكور على هذا المقال الجيد ... عندي استفسار بخصوص الحلول إلي ذكرتها وهي بالتحديد ----------- 3- عطل خاصية الإستعلامات المتداخلة Nested Queries في نظام قواعد البيانات الذي تستخدمه ----------- لو ممكن توضح اكثر شو تقصد بالـNested Queries وكيف يتم تعطيلها وفوائدها بالاساس ، لانه لو مالها داعي أو لا تشكل مشكلة في نظام قواعد البيانات في بالتالي ممكن نتغني عنه واسف على الاطالة واشكرك مره اخرى
     
  • تعليق #2 (إضيف من قبل Binary Tree)
    تقييم
    شكرا جزيلا لمشاركتك أخي العزيز ، فيما يخص الـ Nested Queries فيقصد بها أمر UNION في إستعلام الـ SQL ، الذي يقوم بتنفيذ أمري SQL في إستعلام واحد ، فيما يخص طريقة التعطيل فهذا راجع الى كل نظام قاعدة بيانات ، من تجربتي في الـ MySQL ، هذه الخاصية تكون معطلة إفتراضيا ، ولا يمكن تمرير إستعلامين منفصلين دفعة واحدة كإستعلام واحد ، اما في بقية أنظمة قواعد البيانات مثل MSSQL SERVER و ORACLE فليس لدي علم لأني لم أجرب التطبيق عليها . تحياتي
     
  • تعليق #3 (إضيف من قبل مستخدم غير معروف)
    تقييم

     
  • تعليق #4 (إضيف من قبل مستخدم غير معروف)
    تقييم
    Barakallahou feeka ya akhee wa jazaakaa kolla khayren
     
  • تعليق #5 (إضيف من قبل مستخدم غير معروف)
    تقييم

     
  • تعليق #6 (إضيف من قبل ة ا ة)
    تقييم
    جزاك الله الفردوس الاعلى
     
  • تعليق #7 (إضيف من قبل مستخدم غير معروف)
    تقييم

     
  • تعليق #8 (إضيف من قبل مستخدم غير معروف)
    تقييم
    مشكور
     
  • تعليق #9 (إضيف من قبل مستخدم غير معروف)
    تقييم

     
  • تعليق #10 (إضيف من قبل مستخدم غير معروف)
    تقييم
    بارك الله بك وبعلمك وقريباً إن شاء الله سوف أضع مقالات علمية في هذا الموقع المميز
     
  • تعليق #11 (إضيف من قبل mohamad)
    تقييم
    سلام
     
  • تعليق #12 (إضيف من قبل مستخدم غير معروف)
    تقييم

     
  • تعليق #13 (إضيف من قبل مستخدم غير معروف)
    تقييم

     
  • تعليق #14 (إضيف من قبل Tariq Shadid)
    تقييم
    hello there this example is very bad coz it is impossible to happen in php and mysql coz when u enter (') to input text the php add slash like '
     
  • تعليق #15 (إضيف من قبل sam)
    تقييم
    مقال رائع جزاك الله خير
     
  • تعليق #16 (إضيف من قبل مستخدم غير معروف)
    تقييم
    مشكور
     
أضف تعليق


Binary Tree
مبرمج و مطور للويب ، متخصص في لغة الـ PHP و نظام قواعد البيانات MySQL ، يعمل على منصات التطوير من شركة صن مايكروسيسمتز مثل J2EE و J2SE و ذو خبرة كبيرة في مجال المعايير القياسية لتصميم مواقع الويب 

مشاهدة كافة مقالات Binary Tree
خيارات المقالة
مقالات مشهورة
محررين مشهورين
  1. Binary Tree
  2. SOAP Me
  3. The Byte
  4. هاني الزيد
  5. عبدالرحمن محمد

لم يتم العثور على محررين مشهورين
مواقع صديقة
إعلانات نصية