php  نقل البيانات عبر عنوان الويب

php حماية البيانات ، ثغرة : XSS

آخر تحيين: 09-01-2015

php التأكد من وجود البيانات php GET : إرسال البيانات عبر URL


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

Never Trust User Input : لا تثق أبدا بما يرسله المُستخدِم

بناء على هذه القاعدة ، يجب اعتبار جميع مستخدمي الموقع من أعضاء و زوار كمصدر تهديد ، مع كامل الإحترام ، و في النهاية سيكون غالبا هناك على الأقل قرصان أو قُريصن يحاول اختراق موقعك .
سأريكم ثغرة فادحة في شيفرتنا السابقة ، عندما استعملنا GET_$ لاستخلاص البيانات :

<?php echo $_GET['name'].' '.$_GET['age'];?>

هذه الشيفرة صحيحة . لكن تحتوي على ثغرة خطيرة . تسمى ثغرة xss

تعريف ثغرة xss

Cross Site Scripting : XSS : أي حقن السكريبت عبر الويب .
السكريبت هو مجموعة من الشيفرات . مثلا سكريبت php هو ببساطة مجموعة من شيفرات php و تؤدي دورا معينا .
هذه الثغرة من أسهل الثغرات استغلالا ، و أقدمها على الويب . و الغريب في الأمر أننا لا زلنا نجدها في الكثير من المواقع .
ثغرة XSS تمكن القرصان من حقن سكريبتات "غالبا html و جافاسكريبت "في الموقع المصاب عبر متصفح الزائر . و الهدف من وراء ذلك هو سرقة معلومات و بيانات و هويات الأعضاء . و قد تتنتهي بأخطر من ذلك .
تهدف تقنية القرصان إلى إغراء الضحية و تحفيزه على نقر رابط ملغوم يضم شيفرات جافاسكريبت و تتم هذه الطريقة إما :
بإرسال رسالة إلى البريد الإلكتروني للضحية في الموقع المصاب ، تحفّزه لنقر الرابط الملغوم
أو إرسال تعليق يتضمن الرابط الملغوم في المواقع التي تسمح بإضافة المواضيع .
و الدور الذي يؤديه الرابط الملغوم بجافاسكريبت يختلف حسب نوع الهجوم الذي شنه القرصان ، إما سرقة هويةالضحية و إرسالها لخادومه . أو نشر اللغم في منتدى أو في الملفات الشخصية للأعضاء ...

استغلال ثغرة XSS

لنأخذ مثالنا السابق ، و سنقوم بحقن الرابط بسكريبت جافاسكريبت :

صفحة index.php

<a href="hello.php?name=<script>alert('تمت قرصنتك')</script>"> صفحة الترحيب </a>

صفحة hello.php

<?php echo 'مرحبا بك '.$_GET['name'];?>

بمجرّد نقرك على الرابط الملغوم ، سيقوم متصفّحك بتنفيذ السكريبت ، و ستظهر لك نافذة تنعيك بعملية قرصنتك . لقد قمت بنفسك ، حقن سكريبت القرصان على متصفحك . بدونك ، يبقى السكريبت نائما . حتى تقوم أنت بإيقاضه لينفذ مهمته .
يبقى مثالنا بدون خطورة إذا استثنينا نافذة الإزعاج التي تظهر أثناء النقر على الرابط . ماذا لو حقن القرصان السكريبت التالي : document.cookie . لسرقة الكوكيز الخاص بك .
الكوكيز ملف يتضمن معلومات عنك و عن خادومك و متصفحك . يُنشأ من طرف المتصفح بأمر من الموقع الذي تزوره ، هو بمثابة بطاقة هويتك في الويب . مثلا إذا سجلت الدخول في هكذا موقع ستعطى لك ميزات خاصة ، مثلا إضافة تعاليق أو ملفات أو تعديل أو حذف ...إلخ . بينما أنت تتنقل بين الصفحات ، لا يُطلَب منك كل مرة إدخال اسمك و كلمة المرور . فالموقع لم يعد يحتاج إلى ذلك و لتسهيل العملية ، بمجرد النجاح في دخولك يعطيك رقما كمفتاح و غالبا ما يخزن في الكوكيز . و هذا الرقم التسلسلي هو الذي يخول لك الإستمتاع بميزاتك .
في موقع مصاب يستجيب للظروف ، يمكن للقرصان سرقة الكوكيز الخاص بك و بالتالي سرقة رقمك التسلسلي و انتحال هويتك ثم يبدأ هو أيضا الإستمتاع بميزاتك . و ذلك عبر حقن سكريبت document.coockie

<a href="hello.php?name=<script>alert(document.cookie)</script>"> صفحة الترحيب </a>

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

php حماية ثغرة XSS

لنواصل دائما بمثالنا الذي يتعلق باسم العضو و سنه

<?php echo $_GET['name'].' '.$_GET['age'];?>

لدينا نوعان من المتغير : متغير نصي هو name$ و متغير رقمي هو age$ . لحماية النوعين نستعمل تعليمتين من تعليمات php الجاهزة و هما على التوالي : htmlspecialchars() و (int)

(php (int : حماية البيانات الرقمية

تقوم (int) بتحويل البيانات النصية إلى رقم 0 . أما إذا كانت البيانات عبارة عن عدد فهي تتركها لحالها . بهذه الطريقة إذا حاول أي متطفل كتابة نص بدل الرقم المنتظر . ستقوم int بتحويل نصه إلى عدد 0 و لن يحصل على مبتغاه .
مثال لطريقة الإستعمال .

<?php
  $age = (int)$_GET['age'];
  echo $age;
?>

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

()php htmlspecialchars : حماية البيانات النصية

تقوم htmlspecialchars بتحويل جميع الحركات الخاصة مثلا أصغر من و أكبر من :" < و > " إلى ترميز html . مثلا العلامة ">" ستعوض برمز ";lt&" و الحركة أكبر إلى ";gt&" و هذا يمنع السكريبت من التنفيذ لأنه أصلا لم يعد سكريبتا بعد هذا التحويل . مثال :

<script>alert('تمت قرصنتك');</script> ستحوله htmlspecialchars إلى :&lt;script&gt;alert('تمت قرصنتك');&lt;/script&gt;

مثال الإستعمال :

<?php echo htmlspecialchars($_GET['name']) ;?>
: لحماية البيانات نستعمل
(int) : لحماية البيانات الرقمية
htmlspecialchars() : لحماية البيانات النصية . ستجدون تعليمة أخرى تؤدي نفس الوظيفة ، و هي : htmlentities() . لكن نظرا لاختيارنا لترميز UTF-8 ، سنستعمل دائما htmlspecialchars()