چک لیست امنیتی برای قبل از دیپلوی جنگو

March 2021


همانطور که می‌دانید امنیت وب برای جلوگیری از دسترسی هکر‌ها و سارقان اینترنتی به اطلاعات حساس مهم است. بنابراین، در این پست قصد داریم آسیب پذیری‌ها‌ی امنیتی جنگو و نحوه رفع آن‌ها را بررسی کنیم.

 

چک لیست دیپلوی کردن:

اول از همه، با دنبال کردن دستورالعمل زیر، آسیب پذیری‌های امنیتی خود را بررسی کنید:

manage.py check --deploy

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

 

سایت Mozilla Observatory:

اگر قبلاً برنامه خود را دیپلوی کرده اید، از این سایت برای اسکن وضعیت امنیتی سایت خود استفاده کنید. این سایت همچنین دارای اسکنر‌های شخص ثالث است که سایر جنبه‌های امنیتی سایت شما را آزمایش می‌کند.

 

جلوگیری از جعل درخواست میان وبگاهی یا همان (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 اسکن کرده و در گوگل جستجو کنید که چگونه این پورت های باز را درست کنید 

اگر این پست را دوست داشتید، لطفاً برای کسب اطلاعات جالبتر مانند این، از Reverse Python دیدن کنید و آن را با دوستان خود به اشتراک بگذارید!

مقالات مرتبط

راهنمای برنامه نویسان برای آماده سازی اپلیکیشن های جنگو، برای دیپلوی

شش کاربرد جنگو در وب

جنگو در مقابل ruby on rails: کدامیک بهتر است؟

change django admin title