چک لیست امنیتی برای قبل از دیپلوی جنگو
همانطور که میدانید امنیت وب برای جلوگیری از دسترسی هکرها و سارقان اینترنتی به اطلاعات حساس مهم است. بنابراین، در این پست قصد داریم آسیب پذیریهای امنیتی جنگو و نحوه رفع آنها را بررسی کنیم.
چک لیست دیپلوی کردن
اول از همه، با دنبال کردن دستورالعمل زیر، آسیب پذیریهای امنیتی خود را بررسی کنید:
manage.py check --deploy
شما میتوانید توضیحاتی را مشاهده کنید که اطلاعاتی درباره آسیب پذیریهای برنامه وب Django شما ارائه میدهد. سعی کنید این موارد امنیتی را در گوگل جستجو کرده و آنها را قبل از تولید برطرف کنید.
اگر قبلاً برنامه خود را دیپلوی کرده اید، از این سایت برای اسکن وضعیت امنیتی سایت خود استفاده کنید. این سایت همچنین دارای اسکنرهای شخص ثالث است که سایر جنبههای امنیتی سایت شما را آزمایش میکند.
جلوگیری از جعل درخواست میان وبگاهی یا همان (CSRF)
در یک برنامه وب، اساساً فرمهای وب ورودی را از کاربر میگیرند و آنها را برای پردازش به اجزای سمت سرور میفرستند. اجزای سمت سرور معمولاً سرویس را به صورت روشهای POST، PUT، DELETE برای پذیرش دادهها از طریق HTTP به نمایش میگذارد.
جنگو امنیت را در برابر بیشتر انواع تهدیدهای CSRF ایجاد کردهاست، به شرطی که در صورت لزوم از آن استفاده کرده و به آن این اجازه را بدهید.
همانطور که در اسناد ذکر شدهاست، هنگام علامت گذاری بازدیدها با csrf_exempt خیلی مراقب باشید، مگر اینکه اینکار کاملاً ضروری باشد.
این که کسی به کوکی csrftoken شما (از طریق حمله ی شخص میانیMITM یا xss) دسترسی داشته باشد،یک خطر است.
CSFRنمیتواند شما را در برابر حمله شخص میانی محافظت کند، بنابراین از HTTPS با HTTP strict transportاستفاده کنید.(بعداً در مورد آن بحث خواهیم کرد)
پس از راه اندازی HTTPS، این چند خط را در قسمت settings.py خود اضافه کنید:
CSRF_COOKIE_SECURE = True #to avoid transmitting the CSRF cookie over HTTP accidentally.
SESSION_COOKIE_SECURE = True #to avoid transmitting the session cookie over HTTP accidentally.
Cross site scripting (XSS)
به هکر اجازه میدهد، اسکریپت را به محتوای وب سایت یا برنامه شما تزریق کند. هنگامی که یک کاربر از صفحه آلوده بازدید میکند، اسکریپت در مرورگر قربانی اجرا میشود. این به هکرها اجازه میدهد تا اطلاعات خصوصی مانند کوکیها، اطلاعات حساب و غیره را سرقت کنند.
حفاظت در برابر XSS:1; mode=block امکان فیلتر کردن XSSرا فراهم میکند
در صورت شناسایی حمله، مرورگر به جای پاک سازی صفحه، از ارائه صفحه جلوگیری میکند.
برای فعال کردن آن در جنگو مطمئن شوید که
django.middleware.security.SecurityMiddlew
در لیست میان افزار وجود دارد و خطوط زیر را در settings.pyاضافه کنید:
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
امنیت ادمین جنگو
یکی از مهمترین موارد ایجاد امنیت برای ادمین جنگو است. قبل از دپیلوی برنامه خود، باید admin/path را به چیزی تغییر دهید که فقط خودتان میدانید. در غیر این صورت، هرکسی به راحتی میتواند admin/ را در url تایپ کند و به صفحه ورود ادمین سایت دسترسی پیدا کند.
#urls.py
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls) # change admin something different
شما میتوانید با ابزار django-admin honeypot یک log in غیرواقعی و الکی برای ادمین درست کنید تا اگر کسی اقدام به دسترسی غیرمجاز کند، شما مطلع شوید.
تغییر مسیر SSL
خط زیر را به settings.py خود اضافه کنید تا جنگو مجبور شود همه درخواست های غیر HTTPS را به HTTPS هدایت کند.
SECURE_SSL_REDIRECT = True
سیاست امنیت محتوا (CSP)
اگر برنامه Django شما بزرگ است، حاوی کدهای شخص ثالث زیادی است و اسکریپت ها و سبکهای درون خطی زیادی را در سراسر پروژه پراکنده کرده است، پس باید CSP را به سایت خود اضافه کنید.
برای کسب اطلاعات بیشتر در مورد CSP به لینک"معرفی سیاست امنیت محتوا" مراجعه کنید.
جنگو هیچ روش درون ساخته ای برای ساختن یک csp header ندارد.
پس django_csp موزیلا را نصب کنید و از کنسول مرور گر خود برای ردیابی نقصهای امنیتی در کد خود استفاده کنید.
پس از نصب django_csp کدهای زیر را به settings.py وارد کنید:
# Content Security Policy
CSP_DEFAULT_SRC = ("'none'", )
CSP_STYLE_SRC = ("'self'", )
CSP_SCRIPT_SRC = ("'self'", )
CSP_IMG_SRC = ("'self'", )
CSP_FONT_SRC = ("'self'", )
بنابراین، اساساً، همه اسکریپتها و سبکهای درون خطی شما دیگر مجاز نیستند.
همه اسکریپتها و سبکها باید از یک منبع بارگیری شوند. شما میتوانید 'unsafe_inline' را به اسکریپت و سبک CSP header خود اضافه کنید،اگرچه انجام آن، سیاست کار را نفی میکند.
پاک کردن کد شما از همه این سبکها و اسکریپتهای درون خطی بسیار مهم است. با این حال، برخی از منابع خارجی مانند Google Tag Manager یا Google Analytics باید در سیاست CSP شما مجاز باشند. برای دستیابی به آن، کد خود را مانند این به روز کنید:
#Content Security Policy
CSP_DEFAULT_SRC = ("'none'", )
CSP_STYLE_SRC = ("'self'", "fonts.googleapis.com", "'sha256-/3kWSXHts8LrwfemLzY9W0tOv5I4eLIhrf0pT8cU0WI='")
CSP_SCRIPT_SRC = ("'self'", "ajax.googleapis.com", "www.googletagmanager.com", "www.google-analytics.com")
CSP_IMG_SRC = ("'self'", "data:", "www.googletagmanager.com", "www.google-analytics.com")
CSP_FONT_SRC = ("'self'", "fonts.gstatic.com")
CSP_CONNECT_SRC = ("'self'", )
CSP_OBJECT_SRC = ("'none'", )
CSP_BASE_URI = ("'none'", )
CSP_FRAME_ANCESTORS = ("'none'", )
CSP_FORM_ACTION = ("'self'", )
CSP_INCLUDE_NONCE_IN = ('script-src',)
برای اطلاعات بیشتر نگاهی به لینک"مستنداتdjango csp" بیندازید.
توجه داشته باشید که این پیکربندی بستگی به این دارد که از کدام منابع خارجی استفاده میکنید، لطفاً ابتدا اسناد را بخوانید و سپس تغییرات را در سایت خود اعمال کنید.
امنیت حمل و نقل دقیق HTTP
اگر این سیاست اعمال شود، اگر منابع HTTPS را به درستی سرویس ندهید یا گواهی نامه شما منقضی شود، مرورگرها برای دوره زمانی مشخصی از اتصال به سایت شما خودداری میکنند.
خطوط زیر را به settings.py خود اضافه کنید:
SECURE_HSTS_SECONDS = 86400 # 1 day
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
ابزارهای امنیتی اضافی از Nikita Sobolev
• از Django_axes یا موارد مشابه برای جلوگیری از حملات هکری brute force استفاده کنید.
• از feature_policy header فقط برای روشن کردن چیزهایی استفاده کنید که واقعاً در مرورگر کاربر به آنها نیاز دارید.
• برای جلوگیری از نشت اطلاعات حساس به منابع دیگر از سرصفحه ی Referrer-policy استفاده کنید.
• از امنیت استفاده کنید تا مطمئن شوید وابستگی های شما ایمن است و هیچگونه آسیب پذیری شناخته شده ای ندارد.
• از wemake_python_style guideبرای چک کردن امنیت کد منبع استفاده کنید.
من توصیه می کنم از الگوی wemake django_template استفاده کنید. این یک روش استاندارد انجام پروژه جدید است که روی امنیت و کیفیت کد تمرکز دارد.و همه ی گزینه های لیست را دارد.و حتی چندین ویژگی پیشرفته دیگر!
ماموریت انجام شد!
اکنون برنامه شما تقریباً امن است. علاوه بر این میتوانید پورت های باز خود را با استفاده از nmap اسکن کرده و در گوگل جستجو کنید که چگونه این پورت های باز را درست کنید.