
x32x01
أدارة أكتب كود
- بواسطة x32x01 ||
في عالم البرمجة، واحدة من أخطر الثغرات اللي ممكن تدمر قاعدة بيانات كاملة هي ال SQL Injection، الثغرة ديه مش بس بيتم استخدامها لاختراق الحسابات، لكن كمان لتنفيذ أوامر خطيرة زي حذف كل البيانات في قواعد البيانات الخاصة بيك. الثغرة دي بتحصل لما التطبيق يسمح للمستخدم بإدخال بيانات malicious قبل ما يتم استدعاء قاعدة البيانات والي بيخلي ال hacker عنده القدرة انه يستخدم قاعدة البيانات بطريقة ضارة للنظام وهو وشطارته في حجم الضرر الي ممكن يسببهولك.
مثال على SQL Injection يطيرلك table كاملة:
تخيل عندك SELECT Statement بالشكل ده لاسترجاع بيانات مستخدم بناءً على الـ id:
لو ال attacker كتب في الـ id القيم التالية:
ال SELECT Statement هتبقى بالشكل ده عند التنفيذ:
بمجرد تنفيذ الكود، كل بيانات المستخدمين هتختفي للأبد لان لو خدت بالك دول بقوا 2 queries مش query واحد. شوفنا المشكلة ولكن إزاي تمنع SQL Injection وتحمي بياناتك؟
استخدم الـ Prepared Statements – الطريقة الصح هي انك تمرر القيم ك substitutions باستخدام (?) بدل متحطها علطول في ال query:
ال Input Validation – لازم تتأكد إن القيم المدخلة متوافقة مع نوع البيانات المتوقع، لو id لازم يكون رقم قبل ما تحطه في ال query بتاعك فلو حط string بدل int علطول يرميله error.
تحديد صلاحيات قاعدة البيانات (Database Privileges) – الحساب المستخدم للاتصال بقاعدة البيانات مايكونش عنده صلاحيات لحذف الجداول (DROP TABLE)، حتى لو حصل اختراق، الضرر يكون محدود.
استخدام ORM بدل ال Queries المباشرة – أدوات زي Sequelize أو Prisma بتساعد في بناء Queries محمية تلقائيًا وتقلل احتمالية حدوث SQL Injection.
ال Logging & Monitoring – وجود تسجيل للأنشطة (Audit Logging) يساعد في اكتشاف أي محاولة اختراق قبل ما تسبب ضرر كبير.
الأمان مش رفاهية وخاصة لو شغال في مجال highly regulated، فلو كنت مبرمج، لازم تتأكد إن أي SQL Query في الكود محمي بشكل صحيح. لأن مجرد خطأ بسيط ممكن يخليك تاني يوم متصدر الاخبار عال BBC!
مثال على SQL Injection يطيرلك table كاملة:
تخيل عندك SELECT Statement بالشكل ده لاسترجاع بيانات مستخدم بناءً على الـ id:
Code:
SELECT * FROM users WHERE id = ${req.query.id}
Code:
1; DROP TABLE users;
Code:
SELECT * FROM users WHERE id = 1; DROP TABLE users;

Code:
const query = "SELECT * FROM users WHERE id = ?";
db.execute(query, [req.query.id]);




الأمان مش رفاهية وخاصة لو شغال في مجال highly regulated، فلو كنت مبرمج، لازم تتأكد إن أي SQL Query في الكود محمي بشكل صحيح. لأن مجرد خطأ بسيط ممكن يخليك تاني يوم متصدر الاخبار عال BBC!