طريقة حماية قواعد البيانات من أختراق من خلال prepare statement php

الكاتب: Mr.Aziz

تاريخ النشر: 2022-10-26 12:27:17

مرحبا...

 

الدرس اليوم راح يكون حماية قواعد البيانات و حماية query يعني اي بيانات صادره من قواعد البيانات تكون محمية عن طريق prepare statement 

 

لانه اللغة php لاتقدم لك حماية بشكل مباشر و يجب على المبرمج الانتباه بخصوص من الناحية الحماية و خاصة اذا كنت تبرمج موقعك من php pure يعني بدون framework 

 

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

 

لانه بدون هذي الحماية. الموقع سوف يصبح مصاب بأشهر ثغرات هو sql injection سواء بشكل يدوي أو بالادوات.

هنا على سبيل المثال تحدثنا عنه في قسم السايبر السكيورتي من هنا

 

نبدء بسم الله....

 

في حال أردت أستدعاء البيانات بهذي الطريقة 

 

 

نفس المثال التي عملناه بالدروس السابقه ولكن الاسف  

الكتابة query بهذي طريقة يجعل الموقع مصاب بثغرة sql injection 

 

بدل ان نكتب بهذي طريقة. نكتب بالطريقة هذي مع prepare statement 

 

زي ماتلاحظ نفس query بضبط ولايوجد اي اختلاف الا أضفنا prepare

 

prepare يتم أنشاء prepare statment أو خلينا نقول ينشئ query بداخل prepare 

execute: يتم تشغيل الquery لانه بدونه لن يشتغل معاك.

get_result: يظهر النتائج أو البيانات التي تم استدعاءها في query.

 

ولكن لو أضفنا الشرط مثلآ where carname= 'mazda' 

بهذا الشكل..

 

 

المشكلة هنا يصبح الثغرة واضحة جدآ و حتى يتم تلاعب بها عن طريق parameter تبع المتصفح.

 

نتجنب من هذي المشكلة مع prepare بيكون بهذا الشكل..

ألان وضعت كم اضافة سوف اشرح عنها 

 

راح تلاحظ في where carname بوجود علامة استفهام ؟

ماقصة هذي العلامة ولماذا؟

 

هذي العلامة لما نضعها تصبح نتائج query مخفيه أو غير ظاهره بدل ان تكون 'mazda' سوف يكون علامة استفهام؟

و نجي بعد كذا نضيف bind_param هذا تستطيع وضع المتغيرات التي تحل مكان علامة استفهام

الحرف s تعني string 

ولكن نستطيع نضع حروف اخرى مثل i تعني integer و d تعني double

 

تنبيه مهم: يجب ان يكون مرتبة مثلآ اذا كان أولآ بالشرط carname ? and year ? 

يجب ان تصبح أولآ s ثم i 

 

بعد كذا نضيف متغير جديد  هو $cars بحيث يكون يحل مكان علامة الاستفهام.

 

طيب الان $cars اصبح فارغ لايوجد له اي قيمة 

نزل تحت و نعمل له قيمة 'mazda' زي ماهو موضح بالصوره

 

ألان كأننا وضعت له قيمة ولكن بطريقة مخفية عن انظار..

بعدها نضيف execute ثم get_result

 

طيب ماذا عن insert هل بيكون نفس الطريقة؟

نعم بيكون نفس الطريقة 

 

لنفرض ألان بدون prepare بيكون بهذا الشكل...

 

 

كل الى عليك تركز بعد values بتلاحظ القيم موجوده

 

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

بهذي الطريقة

 

 

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

 

بحيث بعد values بيكون فيه علامة استفهام.

في bind_param  راح تلاحظ أول حرف s  لانه carname عباره عن string 

وثاني حرف i لانه year عباره عن integer و راح تلاحظ مرتبة أولآ string ثم intger 

 

بعد كذا ننشئ له متغير من اختيارنا ثم نضع له قيمة لاحقآ...

 

وبس هذي بكل بساطة prepare statment و له عدة طرق ولكن هذي ابسط طرق لكي أوصل لكم المعلومة

 

في حال وجود خطأ او مشكلة لاتتردد بالتواصل معاي بالتويتر أو اتصال بنا.

 

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