أكيد سمعنا كتير عن ال SQL Injection وقرأنا عنه كتير ، فاحنا هنقدملكم انهاردة دليلكم المختصر والوافي عنه.
فورقة وقلم وتعالوا نتكلم عن ايه هو وليه بنسمع عنه كتير وازاي كمبرمج احمي التطبيقات بتاعتي تجاه النوع دا من الهجمات.
SQL Injection
الـ SQL Injection هو من أشهر أنواع الهجمات الأمنية على تطبيقات الويب و دا لسببين:
- شيوع ال SQL Injection vulnerabilities أو الثغرات من النوع دا في التطبيقات لأنه أي موقع Web بيتعامل مع قواعد البيانات بـ Code معين معرض ان الـ Code دا يكون فيه هذه الثغرات وما علي الـ Attacker أو المهاجم انه يلاقيها ويستغلها.
- لأنه بيستهدف دايمًا قواعد البيانات واللي دايمًا بتشيل بيانات مهمة ممكن الـ Hacker يستغلها.
طريقة الـ SQL Injection
النوع دا من الهجمات معتمد علي ال dynamic sql queries اللي بستخدم String concatenation زي المثال دا
String query = "SELECT account_balance FROM user_data WHERE user_name = "
+ request.getParameter("customerName");
try {
Statement statement = connection.createStatement( ... );
ResultSet results = statement.executeQuery( query );
}هنا اقدر كمهاجم ابعت sql query زي
مكان ال customername والكود مش هيقدر يفرق لأنه الاتنين بالنسبة ليه Strings لكن وقت التنفيذ في قاعدة البيانات الquery ده هيتنفذ وهيرجع كل بيانات العملاء بدل ما يرجع عميل واحد!

طرق الحماية تجاه الـ Sql Injection
في 3 طرق وقاية أساسية تجاه النوع دا من الهجمات:
- استخدام Prepared Statements أو Parameterized Queries
ال parameterized queries ببساطة تقدر تميز اذا كان الـ String دا من ال params أو عبارة عن sql query, فبالتالي تمنع تنفيذ أي query عامل نفسه parameter بأني احوله ل variable في اللغة.
- التحقق من أي بيانات يقوم المستخدم بإدخالها Input Validation and Sanitation
يفضل دايمًا عدم الاستخدام المباشر للقيم المدخلة من المستخدم لازم نعديها الأول على validation function تتحقق أن القيم دي مطابقة للمواصفات اللي ال data field محتاجها, فمثلاً لازم اتأكد ان البيانات المدخلة في خانة رقم التليفون كلها أرقام ولا تحتوي علي حروف وان البيانات طولها مناسب وهكذا.
- تحديد صلاحيات وامتيازات استخدام قواعد البيانات في التطبيق باستخدام (Principle of Least Privilege)
هنا بتأكد ان عينت لكل مستخدم المستوى المناسب من الصلاحيات بتحديد DB Role ليه, فمينفعش أعطي للمستخدم العادي مثلا DB Owner Role
وعيك كمبرمج بالنوع دا من الهجمات أساسي لأنه باستخدام الـ best practices دي من البداية أثناء كتابتك للـ Code وتعاملك مع قاعدة البيانات بيوفر عليك مجهود كبير فيما بعد, غير طبعًا أن الهجمات المتعلقة بالبيانات وتسريبها لجهات غير معنية مكلفة جدًا من الناحية التقنية والعملية.
ولأن منع الهجمات من الحدوث 100% ببساطة غير ممكن لازم نعمل حسابنا اننا نزود تسجيل للأحداث (Logging and Monitoring) بحيث ان لو حصل اي Unexpected Behaviour أقدر أحدد لو كان محاولة هجوم واخذ الاجراءات المناسبة.
المصادر:
https://www.cloudflare.com/learning/security/threats/sql-injection/

Discussion