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

فورقة وقلم وتعالوا نتكلم عن ايه هو وليه بنسمع عنه كتير وازاي كمبرمج احمي التطبيقات بتاعتي تجاه النوع دا من الهجمات.


SQL Injection

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

  1. شيوع ال SQL Injection vulnerabilities أو الثغرات من النوع دا في التطبيقات لأنه أي موقع Web بيتعامل مع قواعد البيانات بـ Code معين معرض ان الـ Code دا يكون فيه هذه الثغرات وما علي الـ Attacker أو المهاجم انه يلاقيها ويستغلها.
  2. لأنه بيستهدف دايمًا قواعد البيانات واللي دايمًا بتشيل بيانات مهمة ممكن الـ 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 زي

💡
'' OR '1'='1'

مكان ال customername والكود مش هيقدر يفرق لأنه الاتنين بالنسبة ليه Strings لكن وقت التنفيذ في قاعدة البيانات الquery ده هيتنفذ وهيرجع كل بيانات العملاء بدل ما يرجع عميل واحد!

SQL Injection
SQL Injection

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

في 3 طرق وقاية أساسية تجاه النوع دا من الهجمات:

  1. استخدام Prepared Statements أو Parameterized Queries

ال parameterized queries ببساطة تقدر تميز اذا كان الـ String دا من ال params أو عبارة عن sql query, فبالتالي تمنع تنفيذ أي query عامل نفسه parameter بأني احوله ل variable في اللغة.

  1. التحقق من أي بيانات يقوم المستخدم بإدخالها Input Validation and Sanitation

يفضل دايمًا عدم الاستخدام المباشر للقيم المدخلة من المستخدم لازم نعديها الأول على validation function تتحقق أن القيم دي مطابقة للمواصفات اللي ال data field محتاجها, فمثلاً لازم اتأكد ان البيانات المدخلة في خانة رقم التليفون كلها أرقام ولا تحتوي علي حروف وان البيانات طولها مناسب وهكذا.

  1. تحديد صلاحيات وامتيازات استخدام قواعد البيانات في التطبيق باستخدام (Principle of Least Privilege)

هنا بتأكد ان عينت لكل مستخدم المستوى المناسب من الصلاحيات بتحديد DB Role ليه, فمينفعش أعطي للمستخدم العادي مثلا DB Owner Role 


وعيك كمبرمج بالنوع دا من الهجمات أساسي لأنه باستخدام الـ best practices دي من البداية أثناء كتابتك للـ Code وتعاملك مع قاعدة البيانات بيوفر عليك مجهود كبير فيما بعد, غير طبعًا أن الهجمات المتعلقة بالبيانات وتسريبها لجهات غير معنية مكلفة جدًا من الناحية التقنية والعملية.

ولأن منع الهجمات من الحدوث 100% ببساطة غير ممكن لازم نعمل حسابنا اننا نزود تسجيل للأحداث (Logging and Monitoring) بحيث ان لو حصل اي Unexpected Behaviour أقدر أحدد لو كان محاولة هجوم واخذ الاجراءات المناسبة.

المصادر:

SQL Injection Prevention - OWASP Cheat Sheet Series
Website with the collection of all the cheat sheets of the project.

https://www.cloudflare.com/learning/security/threats/sql-injection/