مركز التطوير | DevHub

SQL Injection – ثغرة حقن قواعد البيانات

لا شك أننا سمعنا كثيرًا عن ثغرة SQL Injection وقرأنا عنها في العديد من المصادر. اليوم نقدم لكم دليلكم المختصر والوافي حول هذه الثغرة.

فاحضروا معكم ورقة وقلم لنناقش ما هي هذه الثغرة، ولماذا نسمع عنها كثيرًا، وكيف يمكنني كمبرمج حماية تطبيقاتي من هذا النوع من الهجمات.


SQL Injection

الـ SQL Injection هو أحد أشهر أنواع الهجمات الأمنية على تطبيقات الويب، ويعود ذلك لسببين رئيسيين:

1.شيوع ال SQL Injection vulnerabilities أكثر الثغرات شيوعًا في التطبيقات، وذلك لأن أي موقع ويب يتعامل مع قواعد البيانات باستخدام كود معين قد يحتوي على هذه الثغرات. ما على المهاجم (Attacker) سوى العثور عليها واستغلالها.

2.استهداف قواعد البيانات: تستهدف هذه الهجمات قواعد البيانات، التي تحتوي على بيانات مهمة يمكن أن يستغلها القراصنة.


طريقة الـ SQL Injection 

يعتمد هذا النوع من الهجمات على استخدام استعلامات SQL الديناميكية (Dynamic SQL Queries) التي تستخدم التجميع النصي

(String Concatenation).

مثال على ذلك:

PHP
$query = "SELECT account_balance FROM user_data WHERE user_name = " . $_GET['customerName'];

$statement = $connection->query($query);

$results = $statement->fetch_assoc();

في هذا المثال، يمكنني كمهاجم إرسال استعلام SQL مثل:


'' OR '1'='1'


في مكان customerName، ولن يستطيع الكود التمييز بينهما، لأن كليهما يُعتبران نصوصًا (Strings). لكن عند التنفيذ في قاعدة البيانات، سيتم تنفيذ هذا الاستعلام وسيعيد جميع بيانات العملاء بدلاً من استرجاع عميل واحد فقط!


طرق الحماية تجاه الـ Sql Injection

 1.استخدام الاستعلامات المجهزة مسبقًا (Prepared Statements):

تعتبر الاستعلامات المجهزة مسبقًا من أكثر الطرق فعالية للحماية من SQL Injection. حيث يتم فصل الشيفرة (Code) عن البيانات، مما يمنع المهاجمين من إدخال استعلامات ضارة.

PHP

$stmt = $connection->prepare("SELECT account_balance FROM user_data WHERE user_name = ?");
$stmt->bind_param("s", $customerName);
$stmt->execute();

 

2.التحقق من صحة المدخلات (Input Validation):

يجب على المطورين التحقق من جميع المدخلات التي يتلقونها من المستخدمين والتأكد من أنها تتوافق مع الصيغ المتوقعة. يمكن استخدام التعبيرات النمطية (Regular Expressions) أو دوال التحقق من الأنواع (Type-checking) لضمان عدم إدخال بيانات غير صحيحة.

مثال: التأكد من أن اسم المستخدم يحتوي على أحرف فقط.

3.استخدام أذونات قاعدة البيانات (Database Permissions):

يجب تطبيق مبدأ الحد الأدنى من الأذونات (Principle of Least Privilege) على قواعد البيانات. يجب أن يتمتع المستخدمون بتصاريح محدودة فقط، مما يقلل من تأثير أي استغلال ناجح. على سبيل المثال، إذا كان التطبيق يحتاج فقط إلى قراءة البيانات، فلا تعطيه صلاحيات الكتابة.

تساعد هذه الطرق في تقليل المخاطر المرتبطة بهجمات SQL Injection وتعزيز أمان التطبيقات.


المصادر

portswigger

owasp

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *