
- بواسطة x32x01 ||
في عالم البرمجة، لو بتشتغل على موقع أو تطبيق بيستخدم قاعدة بيانات، لازم تكون عارف إن واحدة من أخطر الثغرات اللي ممكن تدمّر كل حاجة هي SQL Injection. 
الثغرة دي مش بس بتخلّي الهاكر يخترق حسابات، لكن كمان يقدر ينفّذ أوامر خطيرة زي حذف قاعدة بيانات كاملة!
في البوست ده، هنشرح إيه هي SQL Injection، إزاي بتحصل، وإزاي تقدر تحمي نفسك منها بخطوات عملية وأكواد واضحة.
خلّيك معانا عشان تتعلّم إزاي تبقى زي الحديد قدام الثغرة دي! 
إيه هي ثغرة SQL Injection؟
SQL Injection هي ثغرة أمنية بتحصل لما التطبيق بيسمح للمستخدم يدخّل بيانات خبيثة (Malicious Input) يقدر من خلالها يتحكم في قاعدة البيانات.
يعني الهاكر بيستغل إن التطبيق بياخد البيانات اللي بيدخلها المستخدم ويحطها على طول في الـ SQL Query من غير ما يفحصها. النتيجة؟ الهاكر يقدر ينفّذ أوامر زي حذف بيانات، سرقة معلومات، أو حتى تدمير النظام كله! 
المشكلة دي بتحصل غالبًا لو الكود بتاعك مش محمي، وبتسمح للمدخلات إنها تتدخل في الـ Query بطريقة مباشرة. لو عايز تفهم أكتر، خلّينا نشوف مثال عملي.
مثال عملي لـ SQL Injection
تخيّل إن عندك موقع فيه SQL Query زي دي عشان تجيب بيانات مستخدم بناءً على الـ ID:
الكود ده بياخد الـ ID من المستخدم مباشرة ويحطه في الـ Query. لو الهاكر دخّل في حقل الـ ID القيمة دي:
الـ Query هتتحول لكده عند التنفيذ:
إيه اللي حصل؟ بدل ما الـ Query تكون جملة واحدة، بقت جملتين! الأولى بتجيب بيانات المستخدم، والتانية بتمسح جدول الـ users كله!
يعني في ثانية، كل بيانات المستخدمين بتاعتك بتختفي للأبد. 
إزاي تحمي نفسك من SQL Injection؟
الحل مش صعب، بس يحتاج إنك تكون دقيق في الكود بتاعك. فيه كذا طريقة عملية تقدر تستخدمها عشان تحمي قاعدة البيانات بتاعتك:
1. استخدم Prepared Statements
الـ Prepared Statements هي أفضل طريقة تحمي بيها الـ Queries. بدل ما تحط مدخلات المستخدم مباشرة في الـ Query، بتستخدم علامة (?) كبديل، وبعدين تمرر القيم بشكل منفصل. كده الهاكر مش هيقدر يدخّل أوامر خبيثة. إليك مثال بـ Node.js مع مكتبة MySQL:
الكود ده بيمرر الـ ID كقيمة منفصلة، فحتى لو الهاكر دخّل
2. Input Validation
لازم تتأكد إن البيانات اللي داخلة من المستخدم تتطابق مع نوع البيانات المتوقع. يعني لو الـ ID لازم يكون رقم (Integer)، اتأكد إنه فعلًا رقم قبل ما تحطه في الـ Query. مثال بسيط بـ JavaScript:
الكود ده بيتأكد إن الـ ID رقم، فلو الهاكر حط نص (String) زي
3. تحديد صلاحيات قاعدة البيانات
حتى لو حصل اختراق، تقدر تحد من الضرر لو استخدمت حساب قاعدة بيانات بصلاحيات محدودة. يعني الحساب اللي بيتصل بقاعدة البيانات مينفعش يكون عنده صلاحية حذف جداول (DROP TABLE) أو تعديل بنية قاعدة البيانات. مثال لإعداد حساب بصلاحيات محدودة في MySQL:
الكود ده بيعمل حساب بصلاحيات بس للقراءة والتعديل، يعني لو الهاكر حاول ينفّذ أمر زي
4. استخدام ORM بدل الـ Queries المباشرة
أدوات زي Sequelize أو Prisma بتساعدك تبني Queries بشكل تلقائي ومحمي من SQL Injection. دي مكتبات بتعمل طبقة وسيطة بين الكود وقاعدة البيانات، فبتقلل احتمالية الأخطاء. مثال بسيط بـ Sequelize:
الكود ده بيستخدم Sequelize عشان يجيب بيانات المستخدم بطريقة آمنة من غير ما تحتاج تكتب Queries يدويًا.
5. الـ Logging & Monitoring
وجود نظام متابعة (Monitoring) وسجلّات (Logging) بيساعدك تكتشف أي محاولة اختراق بسرعة. لو عندك أداة زي Audit Logging، هتقدر تشوف لو فيه Queries شكلها مش طبيعي. مثال بسيط لتسجيل الـ Queries في Node.js:
الكود ده بيسجّل كل Query بيتنفّذ، فتقدر تراجع لو فيه حاجة مش طبيعية.
ليه SQL Injection خطيرة جدًا؟
الثغرة دي مش هزار، لأنها ممكن تسبب:
نصايح إضافية للحماية
موارد لتعلم أكتر عن SQL Injection
لو عايز تتعمق في الموضوع، جرب الموارد دي:
الخلاصة
SQL Injection من أخطر الثغرات اللي ممكن تواجهها كمبرمج، لكن الحماية منها مش صعبة لو اتّبعت الخطوات الصح.
استخدم Prepared Statements، تأكد من مدخلات المستخدم، وقلّل صلاحيات قاعدة البيانات. مع شوية متابعة وتسجيل للأنشطة، هتقدر تحمي موقعك من أي هجوم. لو عايز تبقى زي المحترفين، جرب أدوات زي Sequelize واختبر كودك باستمرار.

الثغرة دي مش بس بتخلّي الهاكر يخترق حسابات، لكن كمان يقدر ينفّذ أوامر خطيرة زي حذف قاعدة بيانات كاملة!

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


إيه هي ثغرة SQL Injection؟
SQL Injection هي ثغرة أمنية بتحصل لما التطبيق بيسمح للمستخدم يدخّل بيانات خبيثة (Malicious Input) يقدر من خلالها يتحكم في قاعدة البيانات. 

المشكلة دي بتحصل غالبًا لو الكود بتاعك مش محمي، وبتسمح للمدخلات إنها تتدخل في الـ Query بطريقة مباشرة. لو عايز تفهم أكتر، خلّينا نشوف مثال عملي.
مثال عملي لـ SQL Injection
تخيّل إن عندك موقع فيه SQL Query زي دي عشان تجيب بيانات مستخدم بناءً على الـ ID: SQL:
SELECT * FROM users WHERE id = ${req.query.id}
الكود ده بياخد الـ ID من المستخدم مباشرة ويحطه في الـ Query. لو الهاكر دخّل في حقل الـ ID القيمة دي:
Code:
1; DROP TABLE users;
الـ Query هتتحول لكده عند التنفيذ:
SQL:
SELECT * FROM users WHERE id = 1; DROP TABLE users;


إزاي تحمي نفسك من SQL Injection؟
الحل مش صعب، بس يحتاج إنك تكون دقيق في الكود بتاعك. فيه كذا طريقة عملية تقدر تستخدمها عشان تحمي قاعدة البيانات بتاعتك:1. استخدم Prepared Statements
الـ Prepared Statements هي أفضل طريقة تحمي بيها الـ Queries. بدل ما تحط مدخلات المستخدم مباشرة في الـ Query، بتستخدم علامة (?) كبديل، وبعدين تمرر القيم بشكل منفصل. كده الهاكر مش هيقدر يدخّل أوامر خبيثة. إليك مثال بـ Node.js مع مكتبة MySQL: JavaScript:
const query = "SELECT * FROM users WHERE id = ?";
db.execute(query, [req.query.id], (err, results) => {
if (err) throw err;
console.log(results);
});
1; DROP TABLE users;
، الـ Query هتتعامل معاها كقيمة عادية مش أمر SQL.2. Input Validation
لازم تتأكد إن البيانات اللي داخلة من المستخدم تتطابق مع نوع البيانات المتوقع. يعني لو الـ ID لازم يكون رقم (Integer)، اتأكد إنه فعلًا رقم قبل ما تحطه في الـ Query. مثال بسيط بـ JavaScript: JavaScript:
const id = req.query.id;
if (!Number.isInteger(Number(id))) {
return res.status(400).send("Invalid ID");
}
const query = "SELECT * FROM users WHERE id = ?";
db.execute(query, [id]);
1; DROP TABLE users;
، هيترفض على طول.3. تحديد صلاحيات قاعدة البيانات
حتى لو حصل اختراق، تقدر تحد من الضرر لو استخدمت حساب قاعدة بيانات بصلاحيات محدودة. يعني الحساب اللي بيتصل بقاعدة البيانات مينفعش يكون عنده صلاحية حذف جداول (DROP TABLE) أو تعديل بنية قاعدة البيانات. مثال لإعداد حساب بصلاحيات محدودة في MySQL: SQL:
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'secure_password';
GRANT SELECT, INSERT, UPDATE ON my_database.* TO 'app_user'@'localhost';
DROP TABLE
، النظام هيرفضه.4. استخدام ORM بدل الـ Queries المباشرة
أدوات زي Sequelize أو Prisma بتساعدك تبني Queries بشكل تلقائي ومحمي من SQL Injection. دي مكتبات بتعمل طبقة وسيطة بين الكود وقاعدة البيانات، فبتقلل احتمالية الأخطاء. مثال بسيط بـ Sequelize: JavaScript:
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');
const User = sequelize.define('User', {
id: { type: DataTypes.INTEGER, primaryKey: true },
name: DataTypes.STRING
});
async function getUser(id) {
return await User.findOne({ where: { id } });
}
5. الـ Logging & Monitoring
وجود نظام متابعة (Monitoring) وسجلّات (Logging) بيساعدك تكتشف أي محاولة اختراق بسرعة. لو عندك أداة زي Audit Logging، هتقدر تشوف لو فيه Queries شكلها مش طبيعي. مثال بسيط لتسجيل الـ Queries في Node.js: JavaScript:
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'app_user',
database: 'my_database'
});
connection.on('query', (query) => {
console.log(`Executing query: ${query.sql}`);
});
ليه SQL Injection خطيرة جدًا؟
الثغرة دي مش هزار، لأنها ممكن تسبب:- حذف بيانات كاملة
: زي إن جدول المستخدمين يتمسح.
- سرقة بيانات حساسة
: زي باسوردات أو معلومات بطاقات الائتمان.
- تدمير النظام
: الهاكر يقدر ينفّذ أوامر تغيّر بنية قاعدة البيانات.
- سمعة سيئة
: لو بيانات عملاءك اتسرقت، شركتك ممكن تتصدر الأخبار بس بطريقة وحشة!
نصايح إضافية للحماية
- حدّث أنظمة قاعدة البيانات
: تأكد إنك بتستخدم أحدث إصدار من MySQL، PostgreSQL، أو أي قاعدة بيانات.
- استخدم WAF
: جدار حماية للتطبيقات (Web Application Firewall) بيمنع محاولات الحقن.
- اختبر كودك
: استخدم أدوات زي SQLMap عشان تختبر موقعك بنفسك.
- درّب فريقك
: خلّي المبرمجين عندك عارفين مخاطر SQL Injection.
موارد لتعلم أكتر عن SQL Injection
لو عايز تتعمق في الموضوع، جرب الموارد دي:- https://owasp.org/www-community/attacks/SQL_Injection: شرح مفصل من OWASP عن SQL Injection.
- كتاب Web Application Security: كتاب قوي لفهم أمن التطبيقات.
- https://sqlmap.org/: أداة مفتوحة المصدر لاختبار SQL Injection.
الخلاصة
SQL Injection من أخطر الثغرات اللي ممكن تواجهها كمبرمج، لكن الحماية منها مش صعبة لو اتّبعت الخطوات الصح. 
التعديل الأخير: