مقال :أساليب الحماية موقعك من الهجمات بسبب الثغرات XSS and SQL Injection

#أمن_المعلومات#أمن_السيبراني

السلام عليكم اليوم ثريد للمطورين الويب بشكل عام و كيف تحمي موقعك وتفلتر موقعك من الثغرات مثل xss و SQL Injection بس بتكلم عنه بشكل بسيط واعرض طريقة فلتره بشكل عام كلها عن طريق اللغه PHP ومااعرف اذا ينطبق مع باقي اللغه. تذكر هذا موضوع الحماية فقط

الثغرة XSS في نوعين الى هي Reflect و stored

طبعآ store هي اخطر ثغره لانه تتخزن في قواعد بيانات وبنفس الوقت لو هكر نفذ سكربات و انحفظت في قاعده بيانات يصير بسهوله تنسرق البيانات الادمن راح اعطيكم مثال.

XXS Reflect: هذا النوع الثغره للتأكيد و تشييك اذا كان الموقع مصاب بالثغره ولالا بالغالب لما تجي تنفذ الامر سكربت راح يطلع لك تنبيه يعني الموقع مصااب ليش لانه احنا ماعملنا فلتره و حمايه عشان نحمي الموقع من تنفيذ هذي سكربات.

مثل ماتلاحظون بالصوره مافي فلتره ابد يعني ماعملنا فلتره فقط حطينا متغير يظهر لنا القيمة فقط من غير فلتره هذا الكود echo

'hey ' . $_GET['search'];

طيب كيف نعمل فلتره الحين؟ كل الى علينا نضيف داله و اكيد يوجد انواع واكثر من طرق ولكن هذي احد الطرق : htmlspecialchars يتبع

قبل: بوجود ثغره
بعد: تم اغلاق الثغرة

يعني بعد مانضيف هذا الكود مع الدالة

echo 'hey ' . htmlspecialchars($_GET['search'])

; راح تطبع اي شي عن طريق html وليس سكربت او اي نوع من الاكواد وطبعآ هذا نوع من حماية لما نجي ننفذ هذا الكود راح يطبع كل شي حتى سكربت يعني يصير الثغره ماله قيمة 🙂

XSS stored: هذي من الاخطر أنواع من ثغره لانه سكربت يتخزن في قاعده بيانات ثم اي احد يدخل الموقع تنرسل هذي بيانات مثل كوكيز الى هكر مثلآ كوكيز تبع الادمن. زي ماتلاحظون بالصوره تم تنفيذ سكربت مرتين في contact بشكل توماتيكي لانه مخزن في قاعده بيانات طبعآ ماراح يطلع لك كذا

اكيد بتروح الهكر بدال ماتجيك 🙂 بس هذا مجرد مثال وكيف نحمي الموقع من ثغره هذي ؟ نعمل فلتره للمدخلات يعني اي احد يحاول يدخل سكربت يرفض ومايصير شي كل الى عليك تسوي دالتين وحده خاصة String وثانيه الايميل مثل الى بالصوره وطبعآ لك خيار تستخدم انواع كثيره من فلتر. يتبع

function filterString($field){
   $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
   if(empty($field)){
       return false;
   }else{
       return $field;
   }

}

function filterEmail($field){
   $field = filter_var(trim($field), FILTER_SANITIZE_EMAIL);

   if(filter_var($field,FILTER_SANITIZE_EMAIL )){
       return $field;
   }else{
       return false;
   }
}

مثل الداله stripslashes او الى سويناه فوق html بس راح استخدم الدالتين الى عرضتها وطبعآ هذي دالتين احنا سويناها وراح نستخدم تبع كل مدخلات زي بالصوره بضبط . بهذي طريقة سويناها من الدالة او تقدر تستخدم دالات اخرى لو تبي 🙂

if ($_SERVER['REQUEST_METHOD'] == 'POST'){

   $name = filterString($_POST['name']);
    // $name = $_POST['name'];
    // $name = stripslashes($name);
    //  $name = htmlspecialchars($name);
     if(!$name){
        $_SESSION['contact_form']['name'] = '';
        $nameError = 'Your name is Require';
    }else{
        $_SESSION['contact_form']['name'] = $name;
    }

   $email = filterEmail($_POST['email']);
    // $email = $_POST['email'];
    // $email = htmlspecialchars($email);
    // $email = stripslashes($email);
     if(!$email){
        $_SESSION['contact_form']['email'] = '';
        $emailError = 'Your email is required';
    }else{
        $_SESSION['contact_form']['email'] = $email;
    }

   $message = filterString($_POST['message']);
    // $message = $_POST['message'];
    // $message = htmlspecialchars($message);
    // $message = stripslashes($message);  
   if(!$message){
        $_SESSION['contact_form']['message']='';
        $messageError = 'Your must enter message';
    }else{
        $_SESSION['contact_form']['message']= $message;
    }

    /// new 
    $documents = $_POST['document'];
    if(!$documents){
        $_SESSION['contact_form']['document'] = '';
        $documentError = 'Error';    
    }else{
        $_SESSION['contact_form']['document'] = $documents;
    }

هنا لما نجي نطبق السكربت يصير سكربت ماله فايده ويتخزن في قاعده بيانات على انه فقط string وليس سكربت 🙂 تتذكرون فوق لما دخلت على contact يطلع نافذه يعني سكربت تنفذ مرتين بسبب وجود سكربت في قاعده بيانات بس هالمره لا خلاص يصير يفلتر اي شي غير عن الاسم والايميل…

Sql Injection: هذي ثغره قاعده بيانات يعني يصير سهل جدآ وصول الى قاعده بيانات سواء كان يدوي او بالادوات تمام لما نجي نكتب مثلآ هذي علامة ” يعني كأننا نكتب Query و نبيه يرد علينا وفعلآ يرد بس الاسف False لانه غير موجود هذي معلومة بنفس الوقت كذا يعني الموقع مصاب الثغره Sql

طيب ايش يعني هذي ثغره؟ هذي الثغره تكون بسببها لعدم وجود فلتر او امان في الاوامر sql و الكود الى كتبته هذا بدون فلتر وعملت تجربه بنفسي وفعلآ وصلت البيانات بأسرع وقت 🙂 مثل موضح باليمين حتى لو مشفره يمديك تكسرها بعد هههه المهم هذا مش موضوعنا موضوعنا كيف نحمي الموقع من هذي ثغرات

 $messageQuery = "select * from messages1 m
    left join services s 
    on m.id_service = s.id_service
        where m.id=".$_GET["id"]." limit 1";
    $message = $mysqli->query($messageQuery)->fetch_array(MYSQLI_ASSOC);

عشان تحمي الموقع من تسرب البيانات تبعك لازم تستخدم هذا الاوامر مع

sql $mysqli->prepare() bind_param(); ->execute(); هذا ايش يسوي بضبط؟ بالتفاصيل بالتغريده جايه بس هذا يعمل على فلتره ومايسمح الاي احد يكتب اي شي من الاوامر يعني مايصير في تفاعل ابدآ وحتى لو تجرب ادوات ماراح تنفع

 $st1 = $mysqli->prepare("select * from messages1 m
    left join services s 
    on m.id_service = s.id_service
        where m.id=? limit 1");

هنا جلب الاستعلام ولكن id يساوي الاستفهام ليش؟

لانه مانبغى احد يعبر في بارميتر ويضع الارقام او فاصلات من عنده 🙂

$st1->bind_param('i',$ID);
        $ID = $_GET["id"];

هنا كأننا نخفي رقم الاي دي الى وضعنا له الاستفهام

ونعمل له متغير جديد و نعرفه على الاي دي 🙂

$st1->execute();
        $message = $st1->get_result()->fetch_array(MYSQLI_ASSOC);

هنا يبدء العمل ويتنفذ الاستعلام الى سويناه

لما نجي ننفذ ونتأكد راح نلاحظ الكويري لم يستجيب لنا ابدآ

وللعلم لازم تسوي هذي حركة الكود بكل sql

bind_param

i = integer

d = double

s = string

وكذا انتهينا و اذا عندكم معلومات افضل شاركو معاي.

وشكرآ لكم و أشوفكم على خير.

لا توجد آراء بشأن "مقال :أساليب الحماية موقعك من الهجمات بسبب الثغرات XSS and SQL Injection"

التعليقات مغلقة.