امنیت در Django: راهنمای کامل محافظت در برابر XSS، CSRF، SQL Injection، Clickjacking، HTTPS، Host Header و موارد دیگر

این مقاله یک مرور جامع از قابلیت‌های امنیتی Django ارائه می‌دهد. موضوعاتی مانند محافظت در برابر XSS، CSRF، SQL Injection، Clickjacking، پیکربندی HTTPS، کوکی‌های امن، HSTS، اعتبارسنجی Host header و سیاست Referrer بررسی می‌شوند. همچنین بهترین روش‌ها برای ایمن‌سازی اپلیکیشن‌های Django توضیح داده شده است.

Django security, COOPsession security, file upload security, CSPContent Security Policy, web security, Django hardening

~6 دقیقه مطالعه • بروزرسانی ۲۴ اسفند ۱۴۰۴

مقدمه

Django از ابتدا با تمرکز بر امنیت طراحی شده است و ابزارهای قدرتمندی برای مقابله با رایج‌ترین حملات وب ارائه می‌دهد. این مقاله یک مرور کامل از مکانیزم‌های امنیتی Django و بهترین روش‌ها برای ایمن‌سازی اپلیکیشن شما ارائه می‌دهد.


همیشه ورودی کاربر را پاک‌سازی کنید

قانون طلایی امنیت وب این است: هیچ‌وقت به ورودی کاربر اعتماد نکنید. تمام داده‌هایی که کاربر کنترل می‌کند باید قبل از استفاده اعتبارسنجی و پاک‌سازی شوند. Django ابزارهای قدرتمندی در فرم‌ها برای این کار دارد.


محافظت در برابر XSS

حملات XSS زمانی رخ می‌دهند که مهاجم بتواند اسکریپت‌های مخرب را در مرورگر کاربران دیگر اجرا کند. سیستم قالب Django به‌طور پیش‌فرض کاراکترهای خطرناک را escape می‌کند و از بیشتر حملات جلوگیری می‌کند.

محدودیت‌ها

Escape کردن قالب‌ها همه‌چیز را پوشش نمی‌دهد. مثال:



اگر var شامل جاوااسکریپت مخرب باشد، ممکن است اجرا شود. استفاده از کوتیشن برای مقدار attribute این مشکل را حل می‌کند.

در موارد زیر باید بسیار محتاط باشید:

  • استفاده از safe
  • استفاده از mark_safe
  • خاموش کردن autoescape
  • تگ‌های سفارشی با is_safe

ذخیرهٔ HTML خام در دیتابیس نیز ریسک XSS را افزایش می‌دهد.


محافظت در برابر CSRF

CSRF حمله‌ای است که کاربر را بدون اطلاعش مجبور به انجام عملی می‌کند. Django با CsrfViewMiddleware از اکثر حملات CSRF جلوگیری می‌کند.

نحوهٔ کار

  • هر درخواست POST باید شامل یک توکن CSRF باشد.
  • توکن به کوکی کاربر وابسته است.
  • در HTTPS، هدر Referer نیز بررسی می‌شود.

استفاده از csrf_exempt فقط در مواقع ضروری توصیه می‌شود.


محافظت در برابر SQL Injection

SQL Injection زمانی رخ می‌دهد که مهاجم بتواند SQL دلخواه اجرا کند. ORM جنگو با استفاده از query parameterization از این حمله جلوگیری می‌کند.

اما هنگام استفاده از موارد زیر باید مراقب باشید:

  • raw()
  • RawSQL
  • extra()

در این موارد باید ورودی کاربر را دستی escape کنید.


محافظت در برابر Clickjacking

Clickjacking زمانی رخ می‌دهد که سایت شما داخل iframe یک سایت مخرب قرار گیرد. Django با X-Frame-Options از این حمله جلوگیری می‌کند.

مقادیر قابل تنظیم:

  • DENY
  • SAMEORIGIN
  • تنظیمات اختصاصی برای هر view

HTTPS و SSL

استفاده از HTTPS برای امنیت ضروری است. بدون HTTPS، مهاجم می‌تواند داده‌ها را شنود یا تغییر دهد.

تنظیمات پیشنهادی

  • SECURE_SSL_REDIRECT = True
  • SESSION_COOKIE_SECURE = True
  • CSRF_COOKIE_SECURE = True
  • SECURE_HSTS_SECONDS برای فعال‌سازی HSTS
  • SECURE_PROXY_SSL_HEADER در صورت استفاده از پروکسی

HSTS باعث می‌شود مرورگر همیشه از HTTPS استفاده کند.


اعتبارسنجی Host Header

هدر Host می‌تواند برای حملاتی مانند CSRF، cache poisoning و جعل لینک استفاده شود. Django این هدر را با ALLOWED_HOSTS اعتبارسنجی می‌کند.

همیشه ALLOWED_HOSTS را صریحاً تنظیم کنید.

اگر از X-Forwarded-Host استفاده می‌کنید، باید:


USE_X_FORWARDED_HOST = True

سیاست Referrer

هدر Referer نشان می‌دهد کاربر از کجا آمده است. با تنظیم Referrer Policy می‌توانید حریم خصوصی کاربران را بهتر حفظ کنید.

Django امکان تنظیم این هدر را در security middleware فراهم می‌کند.


جمع‌بندی

Django مجموعه‌ای قدرتمند از ابزارهای امنیتی ارائه می‌دهد که از اپلیکیشن شما در برابر حملات رایج محافظت می‌کنند. با درک XSS، CSRF، SQL Injection، Clickjacking، HTTPS، HSTS و اعتبارسنجی Host header می‌توانید اپلیکیشن‌هایی امن و مقاوم بسازید. امنیت یک فرآیند مداوم است—همیشه ورودی‌ها را اعتبارسنجی کنید، از HTTPS استفاده کنید و Django را به‌روز نگه دارید.

Cross-Origin Opener Policy (COOP)

هدر COOP به مرورگر اجازه می‌دهد صفحات را از اسناد دیگر جدا کند تا از تعامل مستقیم آن‌ها جلوگیری شود. اگر یک صفحهٔ محافظت‌شده با COOP یک پنجرهٔ popup از دامنهٔ دیگر باز کند، مقدار window.opener در آن popup برابر null خواهد بود.

COOP از حملات cross-origin جلوگیری می‌کند و بخشی از امنیت مرورگرهای مدرن است. برای جزئیات بیشتر، به بخش COOP در مستندات security middleware مراجعه کنید.


امنیت سشن‌ها

سیستم سشن Django (django.contrib.sessions) نیز مانند CSRF محدودیت‌هایی دارد. به‌خصوص، اگر کاربران غیرقابل‌اعتماد به زیردامنه‌های شما دسترسی داشته باشند، ممکن است مشکلات امنیتی ایجاد شود.

برای اطلاعات بیشتر، بخش امنیت در مستندات سشن‌ها را مطالعه کنید.


محتوای آپلودی کاربران

آپلود فایل توسط کاربران همیشه با ریسک همراه است. Django ابزارهایی برای مدیریت فایل‌ها دارد، اما مسئولیت امنیت نهایی با شماست.

نکات مهم:

  • محدود کردن حجم فایل‌ها در وب‌سرور برای جلوگیری از حملات DOS
    مثلاً در Apache با LimitRequestBody
  • غیرفعال کردن ماژول‌هایی مانند mod_php که ممکن است فایل‌های آپلودی را به‌عنوان کد اجرا کنند
  • خطر فایل‌های جعلی: یک فایل HTML می‌تواند با یک هدر PNG جعلی آپلود شود و توسط Pillow معتبر شناخته شود. اگر وب‌سرور آن را به‌عنوان HTML نمایش دهد، حملهٔ XSS رخ می‌دهد.

راهکارهای کاهش ریسک:

  • سرو کردن فایل‌های آپلودی از یک دامنهٔ جداگانه
    مثلاً اگر سایت شما example.com است، فایل‌ها را از usercontent-example.com سرو کنید. نکته: زیردامنه کافی نیست؛ باید دامنهٔ جدا باشد.
  • محدود کردن پسوندهای مجاز برای فایل‌های آپلودی
  • تنظیم وب‌سرور برای سرو کردن فقط فایل‌های مجاز

Content Security Policy (CSP)

CSP یک مکانیزم امنیتی مرورگر است که از حملاتی مانند XSS و تزریق محتوا جلوگیری می‌کند. Django از نسخهٔ 6.0 به‌طور رسمی از CSP پشتیبانی می‌کند.

مزایای CSP:

  • جلوگیری از اجرای اسکریپت‌های inline
  • محدود کردن منابع خارجی (تصاویر، فونت‌ها، CSS، JS)
  • جلوگیری از Clickjacking
  • گزارش‌دهی تخلفات به یک endpoint

محدودیت‌ها و نکات:

  • عدم حذف مسیرها از CSP: حذف حتی یک مسیر می‌تواند کل سیاست امنیتی را تضعیف کند.
  • هزینهٔ پردازشی: تولید nonce برای هر درخواست کمی سربار دارد.
  • پشتیبانی مرورگرها: برخی دستورالعمل‌های CSP سطح 3 ممکن است در همهٔ مرورگرها پشتیبانی نشوند.

نکات امنیتی تکمیلی

Django امنیت خوبی ارائه می‌دهد، اما استقرار صحیح اپلیکیشن نیز ضروری است.

  • قرار دادن کد پایتون خارج از روت وب‌سرور
    تا به‌صورت تصادفی سرو یا اجرا نشود.
  • مراقبت از فایل‌های آپلودی
  • محافظت در برابر brute-force
    Django به‌صورت پیش‌فرض درخواست‌های ورود را محدود نمی‌کند. از ابزارهای جانبی یا ماژول‌های وب‌سرور استفاده کنید.
  • مخفی نگه داشتن SECRET_KEY
    و SECRET_KEY_FALLBACKS در صورت استفاده.
  • محدود کردن دسترسی به دیتابیس و سیستم کش با فایروال
  • مطالعهٔ OWASP Top 10 برای شناخت رایج‌ترین آسیب‌پذیری‌ها
  • مطالعهٔ توصیه‌های امنیتی Mozilla

جمع‌بندی

Django ابزارهای امنیتی قدرتمندی ارائه می‌دهد، اما امنیت نهایی به نحوهٔ استقرار و پیکربندی شما بستگی دارد. با رعایت COOP، CSP، مدیریت صحیح فایل‌های آپلودی، استفاده از HTTPS، محافظت از سشن‌ها و رعایت اصول OWASP می‌توانید اپلیکیشنی امن و مقاوم در برابر حملات بسازید.

نوشته و پژوهش شده توسط دکتر شاهین صیامی