مقدمة
قائمة OWASP Top 10 تلخص أكثر المخاطر شيوعاً في تطبيقات الويب. ليست قائمة نهائية، لكنها نقطة بداية ممتازة: معظم الاختراقات الحقيقية تستغل أخطاء معروفة منذ سنوات. هذا الدرس يشرح أهمها بأمثلة ودفاعات عملية، في سياق حماية تطبيقك أنت.
أهداف التعلم
- فهم XSS ومنعه بالترميز الصحيح وCSP.
- منع الحقن (SQL والأوامر).
- فهم CSRF وحماياته.
- ضبط الترويسات والإعدادات الآمنة.
1. XSS: عندما يصبح نص المستخدم كوداً
إن عرضت تعليقاً كما هو داخل HTML:
container.innerHTML = comment.body; // خطر
فتعليق يحتوي <img src=x onerror=alert(document.cookie)> سينفذ JavaScript في متصفح كل زائر.
الدفاعات:
- رمّز الإخراج حسب السياق. أطر العمل الحديثة (React وغيره) ترمّز النصوص تلقائياً:
<p>{comment.body}</p>آمن. - تجنب
innerHTMLوdangerouslySetInnerHTML. إن احتجت HTML من المستخدم (Markdown مثلاً) فحوّله بمكتبة ثم عقّمه بقائمة وسوم مسموحة (مثل DOMPurify). - CSP (سياسة أمان المحتوى) طبقة ثانية تمنع تنفيذ السكربتات غير المصرح بها حتى لو تسرب وسم:
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-R4nd0m'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'
- ملفات تعريف الارتباط للجلسة بـ
HttpOnlyحتى لا يقرأها السكربت.
2. الحقن
SQL: لا تدمج المدخلات في نص الاستعلام؛ استخدم الاستعلامات المعلّمة:
await db.query('SELECT * FROM topics WHERE slug = $1', [slug]);
الأوامر: لا تمرر مدخلات إلى shell:
// خطر: exec(`ping -c 1 ${host}`)
execFile('ping', ['-c', '1', host]); // الوسائط مصفوفة، بلا shell
وتحقق من المدخل بقائمة مسموحة (مثلاً اسم مضيف بصيغة صحيحة فقط).
3. CSRF
موقع خبيث يجعل متصفح عضو مسجل يرسل طلباً إلى موقعك (تغيير بريد، تحويل نقاط). الحمايات:
- ملفات تعريف الارتباط بـ
SameSite=LaxأوStrict. - التحقق من ترويسة
Originفي كل طلب يغيّر البيانات، أو رمز CSRF في النماذج. - العمليات المغيّرة بـ POST/PUT/DELETE فقط، لا GET.
4. الإعدادات الخاطئة والترويسات
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
- أطفئ رسائل الأخطاء التفصيلية ووضع التطوير في الإنتاج.
- لا تكشف لوحات الإدارة أو قواعد البيانات أو منافذ الخدمات الداخلية للإنترنت.
- حدّث التبعيات وافحصها (
npm audit، Dependabot).
5. المكونات الضعيفة والتسجيل
- التبعيات القديمة من أكثر الطرق شيوعاً للاختراق؛ اجعل تحديثها روتيناً.
- التسجيل والمراقبة: سجّل محاولات الدخول الفاشلة وتغييرات الصلاحيات، دون تسجيل كلمات مرور أو رموز.
6. الدفاع بالعمق
لا تعتمد على طبقة واحدة: تحقق من المدخلات، ورمّز الإخراج، وCSP، وصلاحيات دنيا لحساب قاعدة البيانات، ومراقبة. فشل طبقة لا يعني الاختراق.
تمرين عملي (على تطبيقك أو بيئة تدريب)
- ثبّت تطبيق تدريب مقصود الثغرات مثل OWASP Juice Shop محلياً (
docker run --rm -p 3000:3000 bkimminich/juice-shop) — على جهازك فقط. - ابحث عن XSS في حقل بحث، ثم اكتب كيف كان يجب أن يُرمّز الإخراج.
- افحص ترويسات موقعك بأداة مثل securityheaders.com، وأضف CSP وHSTS.
تنبيه: اختبر فقط تطبيقاتك أو البيئات المصممة للتدريب أو الأنظمة التي لديك إذن مكتوب باختبارها.
أخطاء شائعة
- الاعتقاد أن التحقق من المدخلات وحده يمنع XSS (الترميز عند الإخراج هو الأساس).
- CSP بـ
unsafe-inlineفيscript-srcفتفقد معظم فائدتها. - عمليات تغيير بيانات عبر GET.
- ترك التبعيات دون تحديث لسنوات.
الخلاصة
رمّز الإخراج وعقّم HTML المسموح، استخدم الاستعلامات المعلّمة ولا shell، احمِ من CSRF، اضبط الترويسات، حدّث التبعيات، وابنِ دفاعاً بطبقات متعددة.
مصادر مقترحة
- OWASP Top 10 (أحدث إصدار).
- OWASP Cheat Sheet Series (XSS Prevention، SQL Injection Prevention، CSRF Prevention).
- OWASP Juice Shop للتدريب العملي.