ولد الفجيرة
13-12-2007, 03:47 صباحاً
ثغرات حقن SQL والحماية منها في PHP
السلام عليكم ورحمة الله ..
قبل البدء في الموضوع ثغرات حقن SQL أصبحت خطيرة لأبعد الحدود ولا يستهان بها فأبسطها تكون بالوصول إلى البيانات وتعديلها أو حتى حذفها وأخطرها لا يمكن حصرها لتنوعها وقوتها
وضعت هذا الموضوع بعد أن رأيت بأن الكثير من السكريبتات العربية آخرها vbzoom هي ضحية لثغرات حقن SQL وهذا السبب الذي جعل الكثيرين يبتعدوا عن استخدامها والإتجاه نحو السكريبتات الأجنبية والمعربة.
أبسط طريقة للتسبب في خطأ SQL هو إدخال علامة التنصيص ‘ الكوما في الإنجليزية في اماكن إدخال البيانات سواء فورم ارسال أو في رابط ، في حال ظهر خطأ شبيه لما في الصورة التالية هنا تكون الخطورة حيث يمكن إستغلال الخطأ بوضع جمل إستعلامية SQL في منطقة الخطأ .. الخ ، وتتعدد الخطورة حسب ما ذكرت بالبداية.
http://img511.imageshack.us/img511/9351/sqlinjsamplehx3.jpg
وهنا مثال لعملية حقن SQL في صفحة PHP
<?php
$_POST['username'] = 'shockshadow';
$_POST['password'] = "' OR ''='";
// البحث في قاعدة البيانات عن عضوية مشابهة لمدخلات المستخدم
$query = "SELECT * FROM users WHERE user='".$_POST['username']."' AND password='".$_POST['password']."'";
mysql_query($query);
// لم نقم بفحص المتغير $_POST['password'] الذي أدخله المستخدم, قد يحتوي على أي أوامر يريدها المستخدم! وفي مثالنا هذا قام المستخدم بتخطي كلمة المرور:
?>
هذا يعني بأن الاستعلام الذي تم ارسالة أصبح كالتالي
SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
!! لا تعليق !!
الحماية من ثغرات حقن SQL في PHP ، البعض بل الكثيرين وانا كنت أحدهم يستخدموا عمليات البحث في البيانات المدخلة وفحصها من احتوائها على رموز معينة يتم تحديدها مسبقاً وتنفيذ الأوامر في حال لم يوجد أي من هذه الرموز هذه الطريقة بدائية وقد تفقدنا الكثير من مميزات برامجنا... الأن سأشرح طريقة رسمية ومضمونة وبسيطة جداً تحقق نسبة أمان عالية في تفادي عمليات الحقن وأيضاً يمكننا إدخال أي نوع من الرموز بدون أية مشاكل!! وهي باستخدام إحدى دوال PHP المخصصة لذلك وهي الدالة
Mysql_real_escape_string()
حيث يجب تمرير كل مدخلات المستخدم من خلال هذه الدالة حيث تعمل على فلترة وتحويل الرموز الخطيرة بحيث لا يكون لها أي تأثير في الاستعلام ويتم التعامل معها كنص عادي
مثالنا السابق مع عمل فلترة عن طريق الدالة للمدخلات:
<?php
$_POST['username'] = 'shockshadow';
$_POST['password'] = "' OR ''='";
// البحث في قاعدة البيانات عن عضوية مشابهة لمدخلات المستخدم
$query = "SELECT * FROM users WHERE user='". mysql_real_escape_string($_POST['username'])."' AND password='". mysql_real_escape_string($_POST['password'])."'";
mysql_query($query);
// لاحظ اننا قمنا بفلترة المتغيرات عن طريق الدالة وهنا يتم ابطال مفعول الحقن
?>
درسنا ينتهي هنا وسامحونا على الإطالة التي تعمدتها من أجل إستيعاب هذا النوع من الثغرات
للمزيد تفضل بزيارة الصفحة التالية
http://www.php.net/manual/en/function.mysql-real-escape-string.php
جميع حقوق الشرح محفوظة للأمن الإلكتروني 2007
أخوكم ولد الفجيرة
Tags
Secure against SQL injection attacks
الحماية من ثغرات حقن إس كيو إل SQL
[ملاحظة] : تم التأكد من عدم تشفير الاكواد
السلام عليكم ورحمة الله ..
قبل البدء في الموضوع ثغرات حقن SQL أصبحت خطيرة لأبعد الحدود ولا يستهان بها فأبسطها تكون بالوصول إلى البيانات وتعديلها أو حتى حذفها وأخطرها لا يمكن حصرها لتنوعها وقوتها
وضعت هذا الموضوع بعد أن رأيت بأن الكثير من السكريبتات العربية آخرها vbzoom هي ضحية لثغرات حقن SQL وهذا السبب الذي جعل الكثيرين يبتعدوا عن استخدامها والإتجاه نحو السكريبتات الأجنبية والمعربة.
أبسط طريقة للتسبب في خطأ SQL هو إدخال علامة التنصيص ‘ الكوما في الإنجليزية في اماكن إدخال البيانات سواء فورم ارسال أو في رابط ، في حال ظهر خطأ شبيه لما في الصورة التالية هنا تكون الخطورة حيث يمكن إستغلال الخطأ بوضع جمل إستعلامية SQL في منطقة الخطأ .. الخ ، وتتعدد الخطورة حسب ما ذكرت بالبداية.
http://img511.imageshack.us/img511/9351/sqlinjsamplehx3.jpg
وهنا مثال لعملية حقن SQL في صفحة PHP
<?php
$_POST['username'] = 'shockshadow';
$_POST['password'] = "' OR ''='";
// البحث في قاعدة البيانات عن عضوية مشابهة لمدخلات المستخدم
$query = "SELECT * FROM users WHERE user='".$_POST['username']."' AND password='".$_POST['password']."'";
mysql_query($query);
// لم نقم بفحص المتغير $_POST['password'] الذي أدخله المستخدم, قد يحتوي على أي أوامر يريدها المستخدم! وفي مثالنا هذا قام المستخدم بتخطي كلمة المرور:
?>
هذا يعني بأن الاستعلام الذي تم ارسالة أصبح كالتالي
SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
!! لا تعليق !!
الحماية من ثغرات حقن SQL في PHP ، البعض بل الكثيرين وانا كنت أحدهم يستخدموا عمليات البحث في البيانات المدخلة وفحصها من احتوائها على رموز معينة يتم تحديدها مسبقاً وتنفيذ الأوامر في حال لم يوجد أي من هذه الرموز هذه الطريقة بدائية وقد تفقدنا الكثير من مميزات برامجنا... الأن سأشرح طريقة رسمية ومضمونة وبسيطة جداً تحقق نسبة أمان عالية في تفادي عمليات الحقن وأيضاً يمكننا إدخال أي نوع من الرموز بدون أية مشاكل!! وهي باستخدام إحدى دوال PHP المخصصة لذلك وهي الدالة
Mysql_real_escape_string()
حيث يجب تمرير كل مدخلات المستخدم من خلال هذه الدالة حيث تعمل على فلترة وتحويل الرموز الخطيرة بحيث لا يكون لها أي تأثير في الاستعلام ويتم التعامل معها كنص عادي
مثالنا السابق مع عمل فلترة عن طريق الدالة للمدخلات:
<?php
$_POST['username'] = 'shockshadow';
$_POST['password'] = "' OR ''='";
// البحث في قاعدة البيانات عن عضوية مشابهة لمدخلات المستخدم
$query = "SELECT * FROM users WHERE user='". mysql_real_escape_string($_POST['username'])."' AND password='". mysql_real_escape_string($_POST['password'])."'";
mysql_query($query);
// لاحظ اننا قمنا بفلترة المتغيرات عن طريق الدالة وهنا يتم ابطال مفعول الحقن
?>
درسنا ينتهي هنا وسامحونا على الإطالة التي تعمدتها من أجل إستيعاب هذا النوع من الثغرات
للمزيد تفضل بزيارة الصفحة التالية
http://www.php.net/manual/en/function.mysql-real-escape-string.php
جميع حقوق الشرح محفوظة للأمن الإلكتروني 2007
أخوكم ولد الفجيرة
Tags
Secure against SQL injection attacks
الحماية من ثغرات حقن إس كيو إل SQL
[ملاحظة] : تم التأكد من عدم تشفير الاكواد