السلام عليكم ورحمة الله تعالى وبركاته ،
أهلا إخواني الكرام في أول درس من دورة حماية مواقع وسكربتات php ،
من أول الدروس التي سنتطرق إليها هي الحماية من تغرة sql injection ، والتي تعتبر من أخطر التغرات على الإطلاق ،
لا أريد أن أطول في شرح التغرة كتابيا ، ولكن بشكل عام ، لو كنت تبرمج موقعا ما ، ووضعت query ، وكان في الquery متغير تستقبل قيمته عن طريق الـurl
يعني مثلا القيمة تأتي عن طريق _POST أو _GET ، فتلك القيمة تبقى للزائر أن يقوم بكتابة قيمتها ، فقد يكتب مثلا كود يكمل به الquery التي وضعتها ويضع أمر sql أخر فيقوم بعمل بعض الأشياء السيئة ،
مثل حدف الـtables الموجودة بقاعدة البيانات ، او إظهار بيانات الادمن بعد إيجاد إسم الـtable الخاص به ، وغيرها من الأشياء التي تمنحها لنا لغة الـsql ، لنضع مثالا إدا ، لكيف يكون الكود الغير المحمي من هده التغرة ،
أولا أضع ملفين index و database كليهما بلغة php :

كالتالي ، وبعدها نعمل إتصال بقاعدة البيانات في ملف database :

ننشئ قاعدة البيانات التي وضعنا :

نضع جدول users لنستعمله في الدرس :

بعدها نضع الـcolumns :

ندخل ، تمام :

نفتح الرابط على السيرفر المحلي ، لنرى هل من مشاكل في الإتصال :

لا شيئ يظهر ، بمعنى أنه كل شيئ تمام ، جميل ، نمر الأن لوضع html markup ،

نضع form خاص بالبحت عن username :

النتيجة في المتصفح :

نعمل validation تخص البحت ونعمل query لنبحت عن الإسم الدي سيدخله الزائر :

لنجرب عمل الأمر :

بعد الضغط على submit :

تمام كما برمجنا الأمر ، لأننا لسنا نحتفظ بأي معلومات حول username بإسم hisham ،
ندخل record جديد يدويا ،

بعد إعادة تحميل الصفحة في phpsec ،

كما ترون يقول الأن وجده بعدما أضفناه لقاعدة البيانات ، الأن لنعطي شرح بسيط لخطورة الأمر ، نضع table جديد بإسم admins ، ونضع فيه الأعمدة التالية ، فقط للتجريب :

نمر

جميل ، تمام ، نرجع الأن لسكربتنا ونضع كود sql injection ونستغل التغرة :

كما ترون وضعت كود إستغلال sql ، ليقوم بمحو table admins :

من الوهلة الأولى يبدو كما لو أنه لم يتم العمل ، الأن ندهب إلى phpmyadmin ونتأكد :

كما ترون يوجد فقط table users ، وحدف الـadmins ، تصورو خطورة الأمر لو كان في المنتدى وحدف table الخاص بالمواضيع وحدف كل المواضيع الموجودة بالمنتدى .. ،
للحماية من هده التغرة نقوم بعمل التالي :

نبدل الكود ونستعمل prepare بدل ما إستعملناه المرة الأولى ، ونضع القيمة التي يعطيها لنا الزائر في داخل array الموجودة ب دالة execute ، أما بخصوص الـkey الخاص بالarray فنستعمل الإسم الدي وضعناه في prepare ،
والدي كان :username ، لدلك وضعناه ك مفتاح لل array كدلك .
الأن لنعيد وضع الtable الخاص ب admins ونجرب إستغلال التغرة هل تعمل ام لا :

نضغط go :

تمام :

نرجع لصفحة السكربت وندخل الكود الخاص بالإستغلال :

كما ترون وضعناه لنضغط submit :

كالمرة الأولى ، فهل إشتغل الكود ، لنتأكد من phpmyadmin :

كما ترون إخواني ، الـtable مازال موجودا ولم يحدف مع أننا أدخلنا نفس الكود ،
من هنا إخواني الكرام نفهم أن بعد ما غيرناه في الكود حفظ لنا الـform من تلك التغرة ،
وهده التغرة جد خطيرة ، ولكن مع خطورتها فمن السهل الحماية منها ، فقط يجب عدم السهو ، والتركيز الكامل خصوصا في أمر المدخلات الحرة ،
توجد العديد من الطرق للحماية من sql injection ولكن تبقى هده هي أفضلهم وأقواهم وأسهلهم ، لدلك إستعملوها بشكل مكثف خخ ،
إلى هنا إخواني الكرام ينتهي درسي الأول ، نلتقي في الدرس الثاني بإدن الله ،
مواضيع ذات صلة