طريقة حماية قواعد البيانات من أختراق من خلال 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 و له عدة طرق ولكن هذي ابسط طرق لكي أوصل لكم المعلومة
في حال وجود خطأ او مشكلة لاتتردد بالتواصل معاي بالتويتر أو اتصال بنا.
أشوفكم على خير...