معهد دعم اتش فى اى بى اس لحلول الويب - Powered by vBulletin


 
 
النتائج 1 إلى 7 من 7

الموضوع: تأمين المدخلات من أجل php أمنه - و أكثر تحكماً

  1. #1
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    تأمين المدخلات من أجل php أمنه - و أكثر تحكماً


    بسم الله الرحمن الرحيم
    السلام عليكم ورحمة الله وبركاته

    بدون مقدمات و ندخل في صلب الموضوع علي طول

    الفقره الاولى

    تحديد نوع المتغير المدخل قبل عملية الاستعلام

    ففي بعض الاوقات نريد جلب مقال معين أو قسم تم إضافته في الاسكربت

    و ذلك بيكون عن طريق جلب رقم القسم أو ال id و هذا الشكل التقليدي

    ماذا لو قام الزائر بوضع نص بدل من رقم القسم سيظهر الخطأ الاتي

    mysql_fetch_array(): supplied argument is not a valid MySQL result resource

    أليس هذا سخيفاً

    الحل يكمن في تحويل المدخل الي متغير من النوع الرقمي integer

    بإستخدام الداله intval

    مثال


    كود PHP:
    $id=intval($_GET['id']); 
    فإذا قام الزائر بوضع نص سيتحول الي الرقم 0

    حسناً

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

    الحل يكمن في التحقق من إنشاء المتغير قبل عمل الاستعلام

    مثال


    كود PHP:
                           if(isset($_GET[id]))  

    intval($_GET[id]); 

    #الاستعلام 



    ماذا إذا قام الزائر بحذف ما يساويه ال id

    سيظهر نفس الخطأ أعلاه

    الحل في التأكد من ان المتغير id غير فارغ عن طريق الداله

    empty

    مثال


    كود PHP:
                           if(isset($_GET[id]) and !empty($_GET['id']))  

    intval($_GET[id]); 

    #الاستعلام 


    }  

      [
    IMG]http://cdn5.tribalfusion.com/media/37536.gif[/IMG] 

  2. #2
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: تأمين المدخلات من أجل php أمنه - و أكثر تحكماً


    الفقره الثانيه

    في عمليات البحث في موقعك أو تسجيل الدخول و مثل هذه الاشياء التي تحتاج الي إدخال
    نصوص

    يجب التأكد مما يدخله الزائر لكي نحافظ علي صحة الاستعلامات في مواقعنا

    مثلاً لدينا محرك بحث بسيط في الموقع مكون من فورم و ملف php

    و قام الزائر بوضع مسافه من خلال المسطر و قام بالبحث

    النتيجه سيظهر له جميع محتويات المكان الذي يبحث فيه

    مما يؤثر في عمل موقعك و يؤثر علي السيرفر الحل يكمن في التأكد من أن المتغير الخاص بعملية البحث لايحتوي علي فراغ

    عن طريق الداله

    trim();

    مثال

    كود PHP:
    $search=trim($_GET['search']); 
      
    if(isset(
    $search) and !empty($search) ) 

      

      
    #الاستعلام 

    الان ماذا إذا أردت تحديد عدد الحروف في عملية البحث

    عليك بإستخدام الداله

    strlen();

    مثال



    كود PHP:
    $search=trim($_GET['search']); 
      
    if(isset(
    $search) and !empty($search) and strlen($search)>=

      

      
    #الاستعلام 

    في هذا المثال أجبرنا الزائر علي وضع 5 حروف و إلا لا يتم الأستعلام الخاص بعملية البحث

    الي اللقاء في تكملة هذه الفقره

    يتبع

  3. #3
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: تأمين المدخلات من أجل php أمنه - و أكثر تحكماً


    تكملة الفقرة الثانيه

    في بعض الاوقات اثناء وضع القيم الحرفيه في فورم البحث أو من خلال المتصفح نفسه

    قد يضع الزائر أكواد html قد يكون له اثار ضاره علي الاستعلام الذي يتم إجرائه

    مثلاً لو قام بوضع القيمه null سينتج عن ذلك الاستعلام عن قيمة فارغه قد تضر بعمل الاسكربت الذي تستخدمه

    الحل يكمن في استخدام الداله

    strip_tags();

    بعد التحقق من إنشاء المتغير

    مثال :


    كود PHP:
    $search=$_GET['search']; 
      
    if(isset(
    search)) strip_tags(search); 

  4. #4
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: تأمين المدخلات من أجل php أمنه - و أكثر تحكماً


    الفقره الثالثه

    في بعض الاوقات نشاهد بعض المبرمجين يكتبون القيم الحرفيه في برامجهم

    مما يصعب التعديل علي علي اي منها عندما نريد التعديل

    مزيد من التوضيح :-

    مثلاً أنا عندي في البرنامج بتاعي حقول لإدخال معلومات معينه

    مثل الاتي


    كود:
      #اسم المستخدم  #كلمة المرور  #دخول
    جيد

    عند مثلاً عمل فورم لتسجيل الدخول يضعونه كالاتي


    كود PHP:
    <? 
      
    echo"<form  method=\"post\"  action=\"php-file\"> \n  
    \t\t <input type=\"text\" value=\"معرف المستخدم\"> 
     "

      
    #إلخ 
      
    ?>
    طبعاً ده غلط أول حاجه بيكبر حجم ملفات ال
    php
    لو إنت مش بتستخدم قوالب و كمان لو إنت مثلاً عملت الفورم ده في 7 ملفات و حبيت تغير
    كلمة معرف المستخدم الي اسم المستخدم هضطر تعدل في كل ملف
    طيب لو مثلاً عايز تدي الحريه للمستخدمين الاسكربت ده علشان يعدلوا علي هذه المردفات علي هواهم

    إذاً عليك بفصل القيم الحرفيه عن كودك البرمجي

    بإستخدام نظام اللغات المتعدد

    مثال

    أعمل مجلد في برنامجك إسمه langauge و جواه أعمل ملف php بأي اسم و حط فيه الاتي


    كود PHP:
                           <?php 
      
    $lang
    [username]='اسم المستخدم'
      
    //و هكذا  كلما  أردت  إضافة  قيمه  حرفيه  جديده 
    ?>
    و لإستدعاء متغير القيمة الحرفية بعمل إنكلود للملف في برنامجك

    ليصبح الفورم بهذه الطريقه


    كود PHP:
                           <? 
      
    echo"<form  method=\"post\"  action=\"php-file\"> \n  
    \t\t <input type=\"text\" value=\""
    .$lang['username']."\"> 
     "

      
    #إلخ 
      
    ?>

  5. #5
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: تأمين المدخلات من أجل php أمنه - و أكثر تحكماً


    سأطرق الي خطأ شائع قد يغفل عنه البعض في برامجهم و من ثم سأدخل شرح نظام القوالب

    و لنعتبر هذه

    الفقره الرابعه

    طبعاً لا يخفي علي الكثير منا أهمية إستخدام دوال قراءة الملفات كـ
    include
    require
    file
    readfile

    و لكن ماذا إذا قام مستخدم الاسكربت بعدم رفع الملف الذي تريد قرائته

    مشكله صح نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعي

    الحل بيكون في التأكد من وجود الملف قبل إجراء اي عمليات عليه

    و ذلك عن طريق الداله

    file_exists();
    مثال :-

    كود PHP:
    <?php
     
    //عملية جلب لملف
     
    if(file_exists('anyfile.php')) include('anyfile.php');
     
    ?>

  6. #6
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: تأمين المدخلات من أجل php أمنه - و أكثر تحكماً


    السلام عليكم ورحمة الله وبركاته

    الاخوه الافاضل أحبتي في الله اما بعد

    في هذا الجزء سنتناقش في ثغرات ال file include

    أي تضمين الملفات و هي تأتي من دوال إدارج الملفات

    include
    include_once
    require
    require_once
    file
    readfile
    file_get_contents
    fopen
    fread
    fwrite

    و ثغرات ال file include
    يمكن الاستغلال في حالة اذا كان ال register global on

    علي سبيل المثال هذا الكود


    كود PHP:
                           include($page); 
    يمكن للمخترق الاستغلال من خلال المتصفح للوصول لملف اخر مثلاً


    كود PHP:
    http://yoursite/file.php?$page=الملف 
    يتم إدراج الملف من المتصفح إذاً في هذه الحاله يستطيع المخترق الوصول لأماكن غير مسموح له بها

    و هذا هو الترقيع


    كود PHP:
                           <? 
      
    function sec_include($virable
     { 
        foreach(
    $_GET as $value
        { 
        if(
    ereg($virable,$value)) 
        { 
             
         exit(
    "أنت تقوم بعملية غير مسموح لك بها"); 
        }     
         
        } 


     } 

    ?>
    قمت بعمل هذه الداله لأخد ما في المصفوفه $_GET و التأكد من عد وجود المتغير الذي سأقوم
    بإستعماله و لا ارغب في كتابته في المتصفح


    الان الحل كامل



    كود PHP:
    <?php 

      
    function sec_include($virable
     { 
        foreach(
    $_GET as $value
        { 
        if(
    ereg($virable,$value)) 
        { 

         exit(
    "أنت تقوم بعملية غير مسموح لك بها"); 
        } 

        } 


     } 
    include(
    sec_include($page)); 
    ?>
    و كذلك يمكن الاستفاده من الدله في التخلص من اشياء معينه لا ترغب في استخدامه من خلال المتصفح أو العكس

    هذا مثال


    كود PHP:
                           <? 

      
    function sec_include($virable
     { 
        foreach(
    $_GET as $value
        { 
        if(
    ereg($virable,$value
         or 
    ereg("<",$value
         or 
    ereg("NULL",$value)  
         ) 
        { 

         exit(
    "أنت تقوم بعملية غير مسموح لك بها"); 
        } 

        } 


     }    
      
     
    ?>
    الى اللقاء

    ========

    السلام عليكم ورحمة الله وبركاته

    من حوالي 6 شهور اثناء عملي علي برمجة مركز تحميل تصادف انه تم إختراقه عن طريق

    ملف بإمتداد rar

    فكان لا بد من حلول لهذه الظاهره الان نتكلم بالامثله

    اولاً محرك ال php يقوم بترجمه كل ما هو بإمتداد php فتفاجأت من انه قام بترجمه ملف بإمتداد

    file.php.rar إذاً الثغره في ال php نفسها و ليست لها علاقه بالمبرمج نفسه

    معنى ذلك انه يمكن رفع الشل بهذه الطريقه هذا تفسيري للظاهره


    الان نستعرض بعض الحلول

    أولاً سنقوم بعرض الحلول من وجهة نظري
    الحل هو التأكد من نوعية الملف و ليس امتداده



    كود PHP:
                           <?php 

    $ex
    =array("text/html"
              
    "text/plain"
              
    "magnus-internal/shellcgi"
              
    "application/x-php"
              
    "text/php"
              
    "application/x-httpd-php" 
              
    "application/php"
              
    "magnus-internal/shellcgi"
              
    "text/x-perl"
              
    "application/x-perl"
              
    "application/x-exe"
              
    "application/exe"
              
    "application/octet-stream"
              
    "application/x-java" 
              
    "application/java-byte-code"
              
    "application/x-java-class"
              
    "application/x-java-vm"
              
    "application/x-java-bean"
              
    "application/x-jinit-bean"
              
    "application/x-jinit-applet"
              
    "magnus-internal/shellcgi",  
              
    "image/svg",  
              
    "image/svg-xml"
              
    "image/svg+xml",   
              
    "text/xml-svg",   
              
    "image/vnd.adobe.svg+xml",   
              
    "image/svg-xml",   
              
    "text/xml"
                
              );
    //مصفوفه وضعنا فيها انواع الملفات الغير مرغوب فيها 
    $type=$_files["upload"]["type"]; //استقبلنا نوع الملف من خلال المصفوفه files  
    if(in_array($type,$ex))//التأكد من عدم وجود نوع الملف ضمن المصفوفه 

    exit(
    "لا يمكن رفع الملف حيث هذه العمليه غير شرعيه"); 
      

      
    ?>
    تابع هذا الرابط ييوجد به الانواع و صيغها
    http://scripts.ringsworld.com/form-p...Types.php.html


    بعض المواقع تكتفي بتغير اسم الملف مع الحفاظ علي الامتداد الشرعي له

    و لكن هذه الطريقه غير صحيحه فسيتبقي الملف علي سيرفره بالنوع txt و هذا يعتبر تحايل

    عليه إذا كان لا يصرح برفع هذا النوع كموقع مخرن مثلاً

    نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعي

    أو من الممكن إخفاء ظهور الرابط و جعله يتم تحميل من المتصفح

    و لكن هذا ليس حلاً حيث يمكن للمخترق التوصل للمكان الحقيقي للملف علي السيرفر بتحايلاته

    و كذلك يمكن فتح الملف و البحث في داخله عن ما يشير انه ملف ذات النوع الغير مرغوب فيه

    و لكن لماذا و ال php وفرت لنا معرفة النوع مباشرة

    و للحديث بقيه

  7. #7
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: تأمين المدخلات من أجل php أمنه - و أكثر تحكماً


    بسم الله الرحمن الرحيم

    حقن استعلامات ال sql من أخطر الثغرات الممكن استغلالها في تخريب المواقع أو تخطي منطقه غير مصرح بها

    الان سنعرض امثله

    [1]:-
    مثلاً لدينا جدول للأعضاء
    و يتم من خلاله التأكد من معلومات الاعضاء للسماح لهم بدخول منطقة الاعضاء و متابعة رسائلهم الخاصه و خلافه

    فسيكون استعلام الدخول كالاتي


    كود PHP:
                           <?php 
    $sql
    =mysql_query("select * from `user` where username = '$_GET[username]
     and password = '
    $_GET[password]
     "
    ); 
      
     
    ?>
    هنا قد وقعت في الخطأ فإن كان magic quotes غير مفعل فسيتم استغلال الثغره بهذه الطريقه


    عن طريق الفورم


    بدل من كتابة اسم المستخدم سيتم كتابة


    كود PHP:
     ' or username=' 
    و كذلك مع كلمة المرور

    أو ممكن تنفيذ امر sql لحذف أو تعديل شيئ في قاعدة البيانات

    و ممكن استخدام التعليمه

    UNION

    لهذا الغرض

    لذلك

    الحل يكمن في استخدام الداله

    كود PHP:
                           addslashes 
    علي مدخلات الاستعلام ليصبح كالاتي



    كود PHP:
                           <?php 
    $sql
    =mysql_query("select * from `user` where username = '".addslashes($_GET[username])."' 
     and password = '"
    .addslashes($_GET[password])."' 
     "
    ); 
     
    ?>
    و ايضاً يجب التأكد من وضع علامه تنصيص('المدخل') علي مدخلات الاستعلام حتي لا يتم تخطي الداله

    addslashes

    و إن كان نوع الحقل الذي سيتم الاستعلام من خلاله رقمي

    فيجب استخدام الداله


    كود PHP:
                           intval 
    علي مدخلات الاستعلام

 

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

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