English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL والكسر لـ MySQL

إذا قمت بجمع بيانات إدخال المستخدم من صفحة الويب وإدراجها في قاعدة بيانات MySQL، فإن هناك احتمال أن يحدث مشكلة أمنية اختراق SQL.

في هذا الفصل، سنقدم كيفية منع اختراق SQL، وكيفية تصفية الأحرف المزعجة في SQL بالبرنامج.

يُعرف اختراق SQL عبر إدخال أوامر SQL في استمارات الويب أو أسماء المجالات أو طلبات الصفحات للوصول إلى تنفيذ أوامر SQL ضارة مخادعة.

لا يجب أن نثق أبدًا في إدخال المستخدم، يجب أن نعتبر أن بيانات إدخال المستخدم غير آمنة، ونحتاج إلى تصفية بيانات إدخال المستخدم.

في المثال التالي، يجب أن يكون اسم المستخدم مكونًا من حروف وأرقام وخط تحت المهملة، ومدة اسم المستخدم بين 8 و20 حرفًا:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username إدخال غير صحيح";
}

دعونا نرى الحالة التي تظهر فيها SQL بدون تصفية الأحرف الخاصة:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

في هذه الجمل التهجم، لم نقم بفحص المتغير $name، تم إدراج جمل SQL غير مرغوب فيها في $name، مما يؤدي إلى حذف جميع بيانات جدول users.

في PHP، لا يسمح mysqli_query() بتنفيذ عدة جمل SQL في نفس الوقت، ولكن في SQLite و PostgreSQL يمكن تنفيذ عدة جمل SQL في نفس الوقت، لذا يجب التحقق من بيانات المستخدمين بشكل صارم.

لمنع التهجم بـ SQL، يجب الانتباه إلى النقاط التالية:

  • 1. لا تثق أبدًا في المدخلات للمستخدم. قم بتحقق من المدخلات للمستخدم، يمكن القيام بذلك من خلال تعبيرات النمط أو تحديد الطول، أو التحقق من قوسين وحرف "\" الاستبدال باستخدام "-" المزدوج، وما إلى ذلك.

  • 1. لا تستخدم جمع SQL ديناميكي، يمكنك استخدام جمل SQL م参数ية أو استخدامcedures مخزنة للبحث والاستعلام عن البيانات.

  • 2. لا تستخدم اتصال قاعدة البيانات بمستوى إدارة النظام، استخدم اتصالًا قاعدة بيانات محددًا وغير مكتمل لكل تطبيق.

  • 3. لا تدع البيانات السرية تُخزن بشكل مباشر، قم بتشفير أو تشفير كلمات المرور والمعلومات الحساسة.

  • 4. يجب تقديم معلومات استثنائية للمستخدمين بقدر الإمكان، واستخدام رسائل خطأ مخصصة لتغليف الأخطاء الأصلية

  • 5. عادةً ما يتم استخدام برامج مساعدة أو منصات مواقع الويب للكشف عن التهجم بـ SQL، وتستخدم البرامج أدوات الكشف عن التهجم بـ SQL مثل jsky، بينما تستخدم منصات مواقع الويب أدوات أمان مواقع الويب مثل مليار أمان مواقع الويب وأدوات MDCSOFT SCAN وما إلى ذلك. يمكن استخدام MDCSOFT-IPS للدفاع ضد التهجم بـ SQL، الهجمات XSS وما إلى ذلك.

منع التهجم بـ SQL

في لغات البرمجة السكريبت، مثل Perl و PHP، يمكنك تحويل بيانات المستخدمين لمنع التهجم بـ SQL.

يقدم التوسع MySQLi في PHP دالة mysqli_real_escape_string() لتحويل الحروف الخاصة في المدخلات.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

الإدراج في جملة Like

عندما تقوم بـlike الاستعلام، إذا كان المستخدم يدخل القيمة التي تحتوي على "_" و "%"، سيحدث هذا الحالة: كان المستخدم يريد فقط استعلام "abcd_"، ولكن في نتائج الاستعلام هناك "abcd_"، "abcde"، "abcdf" وما إلى ذلك؛ عند محاولة استعلام "30%" (الاشارة إلى: عشرة بالمئة) سيحدث مشكلة أيضًا.

يمكننا استخدام وظيفة addcslashes() في سكربتات PHP لحل هذه الحالات، مثل المثال التالي:}}

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

يضيف وظيفة addcslashes() شرطة تنكرة أمام الأحرف المحددة.

نموذج الجملة:

addcslashes(string,characters)
الم参数الوصف
النصمطلوب. تحديد النص الذي سيتم فحصه.
الأحرفاختياري. تحديد الأحرف أو نطاق الأحرف المؤثرة على addcslashes().

يمكنك الاطلاع على التطبيقات المحددة في:وظيفة addcslashes() PHP