اشترك في مجموعة montadaphp.net حتى تصلك أخبار المنتدى  

بريدك الإلكتروني:

النتائج 1 إلى 3 من 3
شجرة الإعجاب7إعجاب
  • 4 Post By Ahmed Essam
  • 3 Post By Mr.HELMY

الموضوع: شرح الحماية من ثغرات SQL Injection بإحترافية

  1. #1
    عضو مشارك
    تاريخ التسجيل
    28-07-2012
    السن
    20
    المشاركات
    17
    معدل تقييم المستوى
    0

    Thumbs up شرح الحماية من ثغرات SQL Injection بإحترافية

    بسم الله الرحمن الرحيم،
    فى هذا الدرس -بإذن الله- سأستعرض لكم كيفية أكتشاف ثغرات SQL Injection في برامجكم، ومن ثم كيفية الحماية منها وترقيع تلك الثغرات، وسينقسم الدرس إلى جزئين رئيسيين: الأول: إكتشاف الثغرة، والثاني: ترقيع الثغرة.
    - إكتشاف الثغرة.
    دائمًا ما تكون ثغرات SQL Injection تكون متعلقة بالنماذج التى هى الأخرى مرتبطة بإستعلام متصل بقاعدة البيانات، ولتوضيح ذلك كأبسط مثال على ذلك هو نموذج تسجيل دخول بسيط، سأقوم بعرض الشيفرة المصدرية له الآن.
    كود PHP:
    <?php
    mysql_connect
    ("localhost","user_name","user_password");
    mysql_select_db("user_system");
    if(isset(
    $_POST['email'])):
    $email $_POST['email'];
    $pass sha1($_POST['pass']);
    $users mysql_query("SELECT count(`user_id`) FROM `users` WHERE 
    `user_email`='
    {$email}' AND `user_pass`='{$pass}'"); $total mysql_result($users,0);
    endif;
    if(isset(
    $total)):
    if(
    $total == 0){
    echo 
    "Incorrect Password";
    }else{
    echo 
    "Access Granted!";
    }
    endif;
    ?>
    والشيفرة أعتقد واضحة جدًا، المشكلة فى ثغرات SQL Injection هى كلمة AND فى الإستعلام، فى الجزء الخاص بالتحقق WHERE ، ولكن كيف تقوم بالكشف عن الثغرة؟ حسنًا اتبع تلك الخطوات البسيطة:
    1- اختر الحقل المقصود به أول عمود بعد كلمة WHERE وهنا المقصود user_email ، فنذهب إلى الحقل الخاص بإدخال الايميل فى النموذج.
    2- قم بكتابة اى قيمة موجودة لهذا العمود فى قاعدة البيانات، أى قم بإدخال اسم أى ايميل موجود فى قاعدة البيانات ثم الصق به مباشرة هذا الرمز.
    كود PHP:
    ' -- 
    وهذا الرمز هو ' ثم مسافة ثم علامتين من - ثم مسافة أخرى!
    أى إذا كانت قاعدة البيانات تحتوى على هذا الايميل ahmed2ubu@gmail.com فنكتب:
    كود PHP:
    ahmed2ubu@gmail.com' -- 
    ويمكنك الآن إهمال الحقل الثاني وهو كلمة السر، فتكتب به اى كلمة تريدها سواءًا كانت صحيحة أم خاطئة، أو يمكنك ألا تكتب به أى شيء أصلاً ، وعند تسجيلك للدخول سيتم تسجيل الدخول بنجاح وعرض رسالة Access Granted ! فإذا تم عرض رسالة Access Granted وتم تسجيل الدخول إذًا يوجد فى هذا النموذج ثغرة SQL Injection وعليك ترقيعها فورًا !
    سبب الثغرة أنه بكتابة ' -- يتم التعديل على استعلام SQL ليصبح بالشكل التالي:
    كود PHP:
    SELECT count(`user_id`) FROM `usersWHERE `user_email`='{$email}' -- ' AND `user_pass`='{$pass}
    ليصبح ما بعد {$email} مجرد تعليق لا قيمة له ، فيبحث عن وجود البريد فقط دون وجود كلمة السر.
    - ترقيع الثغرة.
    الحل بسيط جدًا وهو إضافة Back Slash بعد البريد الإلكتروني مباشرة ، أى يصبح الإستعلام هكذا.
    كود PHP:
    SELECT count(`user_id`) FROM `usersWHERE `user_email`='$email\' -- ' AND `user_pass`='{$pass}' 
    وبذلك يتم حل المشكلة، ولكن يستحسن أن تتم إضافة \ تلقائيًا وذلك عبر إدخال المتغير $email فى دالة mysql_real_escape_string ، فيمكنك عمل ذلك عند سحبك للإيميل من النموذج.
    كود PHP:
    $email mysql_real_escape_string($_POST['email']); 
    وبذلك فى الإستعلام يتم إضافة \ بعد الإيميل مباشرة ليتم تلافي إستغلال تلك الثغرة من قبل المتسللين، ولكن توجد هنا مشكلة أخرى، وهى أن أحيانًا على بعض السيرفرات التي ستستخدم برنامجك يوجد حماية تلقائية لتلك الثغرة عبر إضافة \ تلقائيًا دون الحاجة إلى استخدام دالة mysql_real_escape_string ، عندئذٍ سيتم إضافة \\ وفى تلك الحالة فسيتم عمل الثغرة مرة أخرى دون أدنى مشاكل !
    وحل تلك المشكلة هى التحقق عبر دالة get_magic_quote_gpc فإذا كانت تقوم بتحويل TRUE فيتم إدخال متغير الايميل فى الدالة stripslashes حتى يتم حذف الـBack slashes الموجودة به.
    كود PHP:
    if(get_magic_quote_gpc()):
    $_POST['email'] = stripslashes($_POST['email'];
    endif; 
    ولكن ما رأيك ان يتم إختصار كل هذه الشيفرة؟؟ ... فلنقم بإنشاء دالة تقوم بالتحقق من الشرط الماضي، ثم تقوم الدالة بإرجاع المتغير الذي تم إدخاله فى الدالة بعد إدخاله فى دالة mysql_real_escape_string وهذا طبعًا بعد التحقق.
    كود PHP:
    function ares($input){
    if(
    get_magic_quotes_gpc()){
    $input stripslashes($input);
    }
    return 
    mysql_real_escape_string($input);

    ثم الآن تصبح الشيفرة كاملةً هكذا:
    كود PHP:
    function ares($input){if(get_magic_quotes_gpc()){
    $input stripslashes($input);
    }
    return 
    mysql_real_escape_string($input);
    }
    mysql_connect("localhost","user_name","user_password");
    mysql_select_db("user_system");
    if(isset(
    $_POST['email'])):
    $email ares($_POST['email']);
    $pass sha1($_POST['pass']);
    $users mysql_query("SELECT count(`user_id`) FROM `users` WHERE
    `user_email`='
    {$email}' AND `user_pass`='{$pass}'"); $total mysql_result($users,0);
    endif;
    if(isset(
    $total)):
    if(
    $total == 0){
    echo 
    "Incorrect Password";
    }else{
    echo 
    "Access Granted!";
    }
    endif; 
    والآن تأكد من أن الثغرة مرقعة 100% ، الجدير بالذكر أن تلك الطريقة هى الطريقة المُستخدمة لترقيع ثغرة فى PHPAcademy.
    ملاحظات:
    1- لم أقم بوضع شيفرة النموذج Form ، فقم بوضعه أنت.
    2- طريقة تسجيل الدخول التي قمت بشرحها سابقًا فى هذه التدوينة تستخدم خوارزمية محمية من تلك الثغرة، فإذا كنت تستخدم الطريقة التى قمت بشرحها مسبقًا فلا عليك بهذا الدرس.
    المصدر: شخابيط مبرمج PHP
    شخابيط مبرمج PHP: شرح الحماية من ثغرات SQL Injection

  2. #2
    مشرف منتدى مشاكل وحلول PHP الصورة الرمزية Mr.HELMY
    تاريخ التسجيل
    16-05-2011
    المشاركات
    1,108
    معدل تقييم المستوى
    8

    افتراضي رد: شرح الحماية من ثغرات SQL Injection بإحترافية

    شكراً لك اخي شرح وافي

    لكن نسيت انه لازم تكون المدخلات داخل '' <~ لانه اذا لم يكون موجود يكون التخطي سهل

    مثال
    كود PHP:
    mysql_query("SELECT count(user_id) FROM users WHERE user_email=$email AND user_pass=$pass"); 

    كود PHP:
    mysql_query("SELECT count(user_id) FROM users WHERE user_email=$email or 1=1-- AND user_pass=$pass"); 
    لانه مافيه ' علشان يسوي باك سلاش

    تحياتي <~

  3. #3
    عضو مشارك
    تاريخ التسجيل
    23-04-2008
    المشاركات
    73
    معدل تقييم المستوى
    10

    افتراضي رد: شرح الحماية من ثغرات SQL Injection بإحترافية

    بارك الله فيك أخوي

معلومات الموضوع

الأعضاء الذين يشاهدون هذا الموضوع

الذين يشاهدون الموضوع الآن: 1 (0 من الأعضاء و 1 زائر)

المواضيع المتشابهه

  1. [كلاس] dsSafer للحماية من ثغرات ال XSS, SQL Injection, Local File Include
    بواسطة DeaD SouL في المنتدى البرمجة الآمنة PHP Safe Coding
    مشاركات: 6
    آخر مشاركة: 12-07-2011, 12:28 AM
  2. sql injection
    بواسطة obeidat5185 في المنتدى مشاكل وحلول PHP Errors & Troubleshooting
    مشاركات: 2
    آخر مشاركة: 26-06-2010, 01:28 PM
  3. درس طريقة الحماية من SQL Injection
    بواسطة Abu Rayane في المنتدى دروس متقدمة
    مشاركات: 25
    آخر مشاركة: 21-02-2010, 12:37 AM
  4. تغرات أرجو دخول coder أو أحد المشرفين ساعدوني
    بواسطة ملك البرمجة في المنتدى مشاكل وحلول PHP Errors & Troubleshooting
    مشاركات: 31
    آخر مشاركة: 15-08-2009, 03:57 PM
  5. استفسار سؤال : بخصوص هذا الإستعلام هل يوجد خطر من ناحية ثغرات xss
    بواسطة Develophp في المنتدى البرمجة الآمنة PHP Safe Coding
    مشاركات: 15
    آخر مشاركة: 20-05-2009, 06:55 PM

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •