بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله
الشرح عبارة عن دالة بسيطة لتأمين البيانات قبل ادخالها لفواعد البيانات MySQL لتجنب حقن قواعد البيانات و اختراقها
و للتوضيح بشكل اكبر ، نفرض ان لدينا قاعدة بيانات باسم myDataBase ، و بها جدول اسمه members هذا الجدول على الشكل التالى :

و كان سكريبت الـ PHP عبارة عن :
<?php $username = "ahmed"; $password = "5555555"; $query = "SELECT * from members where username = '$username' and password = '$password'"; echo $query; ?>
هذا السكريبت يعرض لنا نص الاستعلام لنرى ما سيحدث بقواعد البيانات فعند تنفيذه سنجد انه يعرض لنا الاستعلام
SELECT * from members where username = 'ahmed' and password = '5555555'
حتى الان الاستعلام صحيح و ليس به مشاكل و لكن ماذا اذا ادخل الزائر مكان الباسورد
' OR username = 'admin
سيكون الاستعلام :
SELECT * from members where username = 'ahmed' and password = '' OR username = 'admin'
اى سيتم تحديد صف الأدمين و هذا ما لا نريد حدوثه ، و لتفادى مثل هذه الاخطاء سنكتب دالة بسيطة تساعدنا فى هذا و سيكون كودها النهائى :
function mysql_safe($var = false,$rejected = '') {
if(!$var) {
$_POST = array_map('mysql_real_escape_string',$_POST);
$_GET = array_map('mysql_real_escape_string',$_GET);
} else {
if(is_array($var)) {
array_map('mysql_real_escape_string',$var);
} else {
$var = mysql_real_escape_string($var);
$var = addcslashes($var,$rejected);
}
return $var;
}
}فى البداية انشأنا دالة تحمل 2 باراميتر
الاول و هو المدخلات المراد تأمينها و اعطيناله القيمة الافتراضية FALSE لجعله باراميتر فاذا اعطينا له قيمة عند استخدام الدالة ستيتم تأمين هذه القيمة و اذا لم يعطى له قيمة سيتم تأمين المصفوفتين POST , GET
الثانى و هو الحروف او الرموز التى نريد اضافة \ لها حتى لا يتم تنفيذها كأمر و اعطيناها القيمة الافتراضية الفارغة
function mysql_safe($var = false,$rejected = '') {
}ثم فحصنا ما إذا كان الباراميتر الاول له القيمة FALSE ( اى لم ندخل اى قيمة اخرى ) و فى حالة تحقق الشرط يتم تأمين المصفوفتين POST, GET عن طريق دالة mysql_real_escape_string ولانهم مصفوفتين فاستخدمنا الدالة array_map لتطبيق الداله mysql_real_escape_string على جميع القيم الموجودة بالمصفوفتين
function mysql_safe($var = false,$rejected = '') {
if(!$var) {
$_POST = array_map('mysql_real_escape_string',$_POST);
$_GET = array_map('mysql_real_escape_string',$_GET);
}
}و فى حالة عدم تحقق الشرط ، فالان نفترض اننا ادخلنا للدالة متغير يحمل القيمة المراد تأمينها و زيادة فى المرونة افترضنا ان تكون ام مصفوفة او متغير طبيعى وتأكدنا من ذلك باستخدام الجملة الشرطية مع is_array و فى حالة تحقق الشرط نطبق mysql_real_escape_string باستخدام array_map , و فى حالة عدم تحقق الشرط نطبق الدالة mysql_real_escape_string مباشرة على المتغير ، ثم نرجع قيمة المتغير
function mysql_safe($var = false,$rejected = '') {
if(!$var) {
$_POST = array_map('mysql_real_escape_string',$_POST);
$_GET = array_map('mysql_real_escape_string',$_GET);
} else {
if(is_array($var)) {
array_map('mysql_real_escape_string',$var);
} else {
$var = mysql_real_escape_string($var);
$var = addcslashes($var,$rejected);
}
return $var;
}
}ملحوظة /
- يمكن استخدام mysql_real_escape_string فقط اذا كان هنك اتصال بين السيرفر و قاعدة البيانات
- هذه الدالة ضمن كلاس بسكريبت مفتوح المصدر اكتبه ، و مازال تحت البناء فيمكن ان يحوى بعض الاخطاء ، للتحميل بالمرفقات :)
ارجو ان يكون قد وفقتى الله فى هذا الموضوع