مقدمة: عندما كدت أفقد بيانات زبائني بسبب ثغرة قديمة 🤦♂️
يا صاحبي، بتذكر مرة، كنا شغالين على مشروع كبير لشركة ناشئة، تطبيق جوال بيعتمد على الذكاء الاصطناعي لتحليل بيانات المستخدمين. الأمور كانت ماشية تمام التمام، الكود نظيف، التصميم خرافي، كل شي بمشي زي الساعة. وفجأة، اكتشفنا ثغرة SQL Injection في أحد الاستعلامات البسيطة! ثغرة عمرها أكتر من عشرين سنة! 🤯
لحسن الحظ، اكتشفناها قبل ما حدا يخترقنا، بس الدرس كان قاسي. الثغرات القديمة ما بتموت، بس بتستنى اللحظة المناسبة لتضرب. وعشان هيك، قررت أشارك معكم أهم خمس ثغرات لسا موجودة وبتشكل خطر كبير في عام 2026، وكيف ممكن نتجنبها.
1. SQL Injection – حقن SQL: العدو الكلاسيكي لا يزال هنا 😈
التعريف والآلية
حقن SQL هو هجوم بيسمح للمهاجم بإدخال أكواد SQL خبيثة في حقول الإدخال بالتطبيق. التطبيق، بدون التحقق الصحيح من المدخلات، بنفذ الكود الخبيث، والمهاجم بيقدر يتحكم في قاعدة البيانات.
حقائق تاريخية من هجمات حقيقية
- هجوم 7-Eleven: اخترق المهاجمون شركات باستخدام SQL injection وسرقوا 130 مليون رقم بطاقة ائتمان.
- حملة ResumeLooters (2023): استخدمت SQL injection لاختراق أكثر من 65 موقع ويب.
كيف نحمي تطبيقاتنا من SQL Injection؟
الحل بسيط: استخدموا الـ “Parameterized Queries” أو “Prepared Statements”. هدول بيعاملوا المدخلات كبيانات، مش كأكواد SQL.
# مثال بلغة Python باستخدام مكتبة psycopg2
import psycopg2
conn = psycopg2.connect("dbname=mydatabase user=myuser password=mypassword")
cur = conn.cursor()
user_id = input("Enter user ID: ")
# استخدام Parameterized Query
cur.execute("SELECT * FROM users WHERE id = %s", (user_id,))
results = cur.fetchall()
print(results)
conn.close()
نصيحة من أبو عمر: لا تثق أبداً بمدخلات المستخدم. دايماً اعملوا تحقق من صحة المدخلات (Input Validation) قبل ما تستخدموها في أي استعلام SQL.
2. Cross-Site Scripting (XSS) – البرمجة النصية عبر المواقع: JavaScript هو سلاح ذو حدين 🔪
التعريف والآلية
XSS هي ثغرة بتسمح للمهاجم بإدراج أكواد JavaScript خبيثة في صفحات ويب. لما المستخدم يزور الصفحة المصابة، الكود الخبيث بيتنفذ في متصفحه، والمهاجم بيقدر يوصل للجلسات والملفات الحساسة.
كيف نحمي تطبيقاتنا من XSS؟
استخدموا “Output Encoding” أو “Escaping”. هدول بيحولوا الأحرف الخاصة (مثل < و >) إلى رموز HTML، عشان المتصفح ما يعتبرها كود JavaScript.
// مثال بلغة JavaScript باستخدام escaping
function escapeHtml(text) {
var map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}
var userInput = document.getElementById('userInput').value;
var escapedInput = escapeHtml(userInput);
document.getElementById('output').innerHTML = escapedInput;
نصيحة من أبو عمر: استخدموا مكتبات Escaping جاهزة، زي DOMPurify. هدول المكتبات بيساعدوكم تحموا تطبيقاتكم من XSS بشكل فعال.
3. Server-Side Request Forgery (SSRF) – انتحال الطلبات من الخادم: الخادم تبعك ممكن يكون جاسوس 🕵️♂️
التعريف والآلية
SSRF هو هجوم بيخدع خادم الويب ليصدر طلبات HTTP لخدمات وموارد داخلية ما بيقدر المستخدم يوصلها مباشرة. المهاجم بيستخدم تطبيق الويب كوسيط للوصول لخدمات الشبكة الداخلية أو بيانات السحابة الحساسة.
كيف نحمي تطبيقاتنا من SSRF؟
عملوا “Input Validation” على عناوين URL اللي بيستخدمها الخادم. تأكدوا إن الخادم مابيوصلش لعناوين URL غير مصرح بيها.
# مثال بلغة Python
import requests
from urllib.parse import urlparse
def is_safe_url(url):
parsed_url = urlparse(url)
# السماح فقط بعناوين URL من نطاق معين
allowed_domains = ["example.com", "api.example.com"]
return parsed_url.netloc in allowed_domains
url = input("Enter URL: ")
if is_safe_url(url):
response = requests.get(url)
print(response.text)
else:
print("Unsafe URL!")
نصيحة من أبو عمر: استخدموا “Whitelist” لعناوين URL المسموح بيها، بدل ما تستخدموا “Blacklist”. الـ Whitelist أكثر أماناً، لأنه بيمنع أي عنوان URL مش موجود في القائمة.
4. Insecure Deserialization – إلغاء التسلسل غير الآمن: لا تثق بالبيانات المسلسلة 📦
التعريف والآلية
إلغاء التسلسل هو عملية تحويل البيانات المسلسلة (زي JSON أو Binary) إلى كائنات برمجية. إذا التطبيق ما تحققش من صحة البيانات المستلمة، المهاجم بيقدر يدرج كائنات خبيثة.
كيف نحمي تطبيقاتنا من Insecure Deserialization؟
تجنبوا استخدام إلغاء التسلسل قدر الإمكان. إذا اضطريتوا تستخدموه، استخدموا “Data Signing” أو “Encryption” لحماية البيانات المسلسلة.
// مثال بلغة Java باستخدام التشفير
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;
public class SecureSerialization {
public static void main(String[] args) throws Exception {
// توليد مفتاح سري
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey secretKey = keyGen.generateKey();
// تهيئة Cipher للتشفير
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// البيانات المراد تشفيرها
String data = "This is sensitive data";
byte[] byteDataToEncrypt = data.getBytes();
// تشفير البيانات
byte[] byteCipherText = cipher.doFinal(byteDataToEncrypt);
String encryptedText = Base64.getEncoder().encodeToString(byteCipherText);
System.out.println("Encrypted Text : " + encryptedText);
// تهيئة Cipher لفك التشفير
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] byteDecryptedText = cipher.doFinal(byteCipherText);
String decryptedText = new String(byteDecryptedText);
System.out.println("Decrypted Text : " + decryptedText);
}
}
نصيحة من أبو عمر: استخدموا صيغ بيانات آمنة، زي JSON Web Tokens (JWT). هدول الصيغ بيوفروا آليات للتحقق من صحة البيانات.
5. Broken Access Control – التحكم في الوصول المعطوب: مين مسموحله يشوف إيه؟ 🔐
التعريف والآلية
بيحصل لما التطبيق ما بيتحققش بشكل صحيح من إن المستخدم له الحق في الوصول لمورد معين. المستخدم بيقدر يوصل لبيانات ووظائف لازم تكون محظورة عليه.
الأشكال الرئيسية
- IDOR (Insecure Direct Object Reference): الوصول لموارد من خلال تعديل معرفات المستخدمين.
- Broken Function Level Authorization: الوصول لوظائف إدارية.
- URL Parameter Tampering: تعديل معاملات URL.
كيف نحمي تطبيقاتنا من Broken Access Control؟
استخدموا “Role-Based Access Control (RBAC)”. هادا بيسمح لكم تحددوا صلاحيات لكل مستخدم، وتتحكموا في الوصول للموارد.
# مثال بلغة Python باستخدام RBAC
def check_permission(user_role, resource, action):
permissions = {
"admin": {
"users": ["read", "write", "delete"],
"products": ["read", "write", "delete"]
},
"user": {
"products": ["read"]
}
}
if user_role in permissions and resource in permissions[user_role] and action in permissions[user_role][resource]:
return True
else:
return False
user_role = "user"
resource = "products"
action = "read"
if check_permission(user_role, resource, action):
print("Access granted!")
else:
print("Access denied!")
نصيحة من أبو عمر: دايماً تحققوا من صلاحيات المستخدم قبل ما تسمحوا له بالوصول لأي مورد. لا تعتمدوا على معرفات المستخدمين (IDs) في عناوين URL، لأن المستخدم ممكن يعدلها.
الخلاصة: الأمن رحلة، مش وجهة 🚀
يا جماعة الخير، الأمن مش مجرد كود بنكتبه مرة وخلاص. الأمن هو عملية مستمرة من المراقبة والتحديث والتطوير. لازم نكون دائماً على اطلاع بأحدث الثغرات والتقنيات، ونطبق أفضل الممارسات الأمنية في تطبيقاتنا. تذكروا، الوقاية خير من ألف علاج! 👍
نصيحة أخيرة من أبو عمر: شاركوا معلوماتكم مع زملائكم، واعملوا مراجعات دورية للكود. الأمن مسؤولية جماعية، مش مسؤولية فرد واحد. بالتوفيق! 🙏