Trong bài hướng dẫn này, bạn sẽ tận dụng một quy trình làm việc chú trọng đến bảo mật ứng dụng Django của mình bằng cách triển khai và cấu hình các settings dựa trên môi trường, tệp .env, và các thiết lập bảo mật tích hợp sẵn của Django. Những tính năng này hỗ trợ lẫn nhau và sẽ giúp dự án Django của chúng ta sẵn sàng cho nhiều cách triển khai khác nhau.

Phát triển một ứng dụng Django thường mang lại trải nghiệm mượt mà nhờ thiết kế linh hoạt và khả năng mở rộng của framework này. Điều này cũng áp dụng cho các thiết lập bảo mật tích hợp sẵn trong Django, giúp bạn chuẩn bị dự án cho môi trường production. Tuy vậy, vẫn còn nhiều cách để nâng cao mức độ bảo mật cho dự án.
Việc tách riêng các file cấu hình sẽ giúp chúng ta thiết lập các cấu hình khác nhau tùy theo môi trường. Tận dụng tệp .env để khai báo biến môi trường hoặc ẩn settings bảo mật sẽ đảm bảo không tiết lộ thông tin nhạy cảm gây nguy hiểm cho dự án. Bên cạnh đó, việc thay đổi các URL mặc định và các thiết lập khác cũng sẽ giúp giảm thiểu các lỗ hổng bảo mật phổ biến.
Mặc dù áp dụng những chiến lược này có thể làm chậm tiến độ phát triển ban đầu, nhưng một khi quy trình đã được thiết lập hiệu quả, chúng ta có thể triển khai các phiên bản của dự án mà vẫn đảm bảo cả tính bảo mật lẫn hiệu suất làm việc.
Yêu cầu trước khi bắt đầu
Trước khi thực hiện hướng dẫn này, bạn cần chuẩn bị:
- Một dự án Django có sẵn. Nếu chưa có, bạn có thể tìm và làm theo hướng dẫn Cách cài đặt Django và thiết lập môi trường phát triển.
- Cài đặt Python 3 và thiết lập môi trường lập trình trên máy chủ Ubuntu 20.04.
- Chứng chỉ Let’s Encrypt. Nếu chưa có, bạn có thể tham khảo hướng dẫn Cách bảo mật Nginx bằng Let’s Encrypt trên Ubuntu 20.04 để cài đặt.
- Để sử dụng chứng chỉ Let’s Encrypt, bạn cần cài đặt Nginx trên Ubuntu.
- Loạt bài về phát triển Django này sẽ giúp bạn nhanh chóng làm quen với cấu trúc tập tin và các thiết lập cốt lõi của Django.
Lưu ý: Nếu bạn đang sử dụng một dự án Django hiện có, các yêu cầu có thể khác so với những gì được mô tả trong bài viết này. Hướng dẫn này đề xuất một cấu trúc dự án cụ thể; tuy nhiên, bạn hoàn toàn có thể áp dụng từng phần riêng biệt trong bài viết sau theo nhu cầu của mình.
Bước 1: Tái cấu trúc tệp settings của Django
Trước khi đi sâu vào chủ đề bảo mật dự án Django, bạn cần chuyển đến thư mục dự án và kích hoạt môi trường ảo:
cd django-apps
. env/bin/activate
Ở bước đầu tiên này, chúng ta sẽ bắt đầu bằng cách sắp xếp lại nội dung tệp settings.py thành các cấu hình riêng biệt theo từng môi trường. Đây là một cách làm phổ biến và hiệu quả khi cần chuyển đổi dự án giữa các môi trường khác nhau, ví dụ như môi trường phát triển và môi trường sản xuất. Cách sắp xếp này sẽ giảm thiểu nhu cầu cấu hình lại mỗi khi cần thay đổi môi trường. Thay vào đó, chúng ta sẽ sử dụng biến môi trường để chuyển đổi giữa các cấu hình, nội dung này sẽ được trình bày chi tiết hơn trong phần sau của hướng dẫn.
Tạo một thư mục mới có tên là settings trong thư mục con của dự án:
mkdir testsite/testsite/settings
(Như đã đề cập trong phần yêu cầu, hướng dẫn này sử dụng dự án tên testsite, bạn có thể thay bằng tên dự án của mình nếu muốn.)
Thư mục này sẽ thay thế cho tệp cấu hình settings.py hiện tại. Tất cả các cấu hình theo môi trường sẽ được đặt trong các tệp riêng biệt bên trong thư mục này.
Trong thư mục settings vừa tạo, bạn cần tạo 3 tệp Python:
cd testsite/testsite/settings
touch base.py development.py production.py
Tệp development.py sẽ chứa các thiết lập thường dùng trong suốt quá trình phát triển. Tệp production.py sẽ chứa các thiết lập dùng cho máy chủ sản xuất. Bạn cần tách biệt 2 tệp này vì nhiều thiết lập trong cấu hình sản xuất không phù hợp để áp dụng trong quá trình phát triển — chẳng hạn như yêu cầu bắt buộc sử dụng HTTPS, bổ sung các tiêu đề bảo mật, hoặc kết nối với cơ sở dữ liệu sản xuất.
Tệp base.py sẽ chứa các thiết lập dùng chung mà development.py và production.py sẽ kế thừa. Điều này giúp giảm trùng lặp và giữ cho mã nguồn gọn gàng. Các tệp Python này sẽ thay thế cho settings.py, vì vậy hãy xóa settings.py để tránh gây nhầm lẫn cho Django.
Vẫn trong thư mục settings, đổi tên settings.py thành base.py bằng lệnh sau:
mv ../settings.py base.py
Như vậy, bạn đã hoàn tất phần khung của cấu trúc thư mục cấu hình theo môi trường mới. Tuy nhiên, dự án của bạn hiện chưa nhận diện được cấu hình này, vì vậy bước tiếp theo là điều chỉnh để Django có thể sử dụng cấu hình mới.
Bước 2: Sử dụng django-environ
Hiện tại, Django chưa thể nhận diện thư mục settings mới cũng như các tệp bên trong. Trước khi tiếp tục cấu hình theo môi trường, bạn cần tích hợp Django với django-environ: một phụ thuộc giúp tải các biến môi trường từ tệp .env. Nghĩa là Django sẽ tìm kiếm tệp .env trong thư mục gốc của dự án để xác định cấu hình nào sẽ được sử dụng.
Truy cập thư mục gốc của dự án và dùng lệnh ls để kiểm tra nội dung:
cd ../../
ls
Nội dung thư mục gốc của dự án sẽ giống như sau:
db.sqlite3 manage.py testsite
Cài đặt django-environ:
pip install django-environ
Tiếp theo, bạn cần cấu hình Django để sử dụng tệp .env. Chúng ta sẽ chỉnh sửa 2 tệp: manage.py dùng trong quá trình phát triển và wsgi.py dùng khi triển khai sản phẩm.
Mở tệp manage.py để chỉnh sửa:
nano manage.py
Thêm đoạn mã sau:
import os
import sys
<^>import environ
environ.Env.read_env()<^>
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testsite.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
Lưu và đóng tệp bằng cách nhấn CTRL+X, sau đó nhấn Y để lưu và nhấn ENTER.
Tiếp theo, mở tệp wsgi.py:
nano testsite/wsgi.py
Thêm các dòng sau:
import os
<^>import environ
environ.Env.read_env()<^>
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testsite.settings')
application = get_wsgi_application()
Lưu và đóng tệp bằng cách nhấn CTRL+X, sau đó nhấn Y để lưu và nhấn ENTER.
Hai đoạn mã mới thêm vào sẽ thực hiện 2 nhiệm vụ. Mỗi khi Django được chạy (dù qua manage.py trong môi trường phát triển hay wsgi.py trong môi trường sản xuất), hệ thống sẽ tìm và đọc nội dung tệp .env. Nếu tệp này tồn tại, Django sẽ dùng thông tin trong đó để xác định tệp cấu hình cần sử dụng. Nếu không có tệp .env, Django sẽ mặc định sử dụng cấu hình phát triển.
Tiếp theo, tạo tệp .env trong thư mục hiện tại:
nano .env
Thêm dòng sau để chỉ định sử dụng cấu hình phát triển:
DJANGO_SETTINGS_MODULE="testsite.settings.development"
Lưu và đóng tệp bằng cách nhấn CTRL+X, sau đó nhấn Y để lưu và nhấn ENTER.
Lưu ý: Thêm .env vào tệp .gitignore để tệp này không bị đưa vào các lần commit vì tệp .env sẽ chứa các thông tin nhạy cảm như mật khẩu, khóa API… cần được bảo mật. Nên duy trì một tệp .env riêng cho từng môi trường mà dự án được triển khai, chứa các thiết lập phù hợp với môi trường đó.
Bạn nên tạo một tệp mẫu .env.example và đưa vào dự án để dễ dàng tạo ra tệp .env mới khi cần.
Theo cấu hình mặc định, Django sẽ sử dụng cấu hình từ testsite.settings.development, nhưng nếu thay đổi biến DJANGO_SETTINGS_MODULE thành testsite.settings.production, Django sẽ chuyển sang sử dụng cấu hình sản xuất. Bước tiếp theo là điền nội dung cụ thể cho các tệp development.py và production.py.
Bước 3: Thiết lập môi trường phát triển và sản xuất
Tiếp theo, bạn sẽ mở tệp base.py và thêm các cấu hình mà bạn muốn thay đổi cho từng môi trường riêng biệt trong các tệp development.py và production.py. Tệp production.py sẽ cần sử dụng thông tin xác thực cơ sở dữ liệu của môi trường sản xuất, vì vậy bạn phải chuẩn bị sẵn các thông tin này.
Lưu ý: Bạn cần tự xác định xem những thiết lập nào cần cấu hình theo môi trường. Trong hướng dẫn này, chúng ta sẽ minh họa một số cấu hình phổ biến giữa môi trường phát triển và môi trường sản xuất, cụ thể là các thiết lập bảo mật và cơ sở dữ liệu riêng biệt.
Hướng dẫn này sử dụng dự án Django được tạo từ bài hướng dẫn cài đặt trước đó. Đầu tiên, bạn sẽ chuyển các thiết lập phù hợp từ base.py sang development.py. Mở tệp development.py:
nano testsite/settings/development.py
Sau đó thêm đoạn mã sau:
import os
from .base import *
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
Lưu và đóng tệp bằng cách nhấn CTRL+X, sau đó nhấn Y và ENTER.
Trong đoạn mã trên, bạn đã import tất cả thiết lập từ base.py, tệp này sẽ kế thừa toàn bộ thiết lập từ base.py. Tiếp theo, bạn sẽ chuyển các thiết lập mà bạn muốn thay đổi cho môi trường phát triển. Trong trường hợp này, các thiết lập dành riêng cho môi trường phát triển bao gồm: DEBUG, cần đặt là True trong môi trường phát triển không phải trong môi trường sản xuất; và DATABASES, sử dụng cơ sở dữ liệu cục bộ thay vì cơ sở dữ liệu production. Ở đây, bạn đang dùng cơ sở dữ liệu SQLite cho môi trường phát triển.
Lưu ý: Vì lý do bảo mật, Django không bao giờ hiển thị giá trị của các thiết lập chứa chuỗi như API, KEY, PASS, SECRET, SIGNATURE hoặc TOKEN trong chế độ DEBUG.
Điều này nhằm đảm bảo các thông tin bí mật sẽ không bị lộ nếu bạn vô tình triển khai dự án lên môi trường sản xuất khi đang bật DEBUG.
Tuy nhiên, tuyệt đối không được triển khai công khai một dự án khi DEBUG đang bật, vì điều đó sẽ luôn đặt bảo mật của dự án vào tình trạng rủi ro.
Tiếp theo, bạn sẽ thiết lập nội dung cho tệp production.py. Mở tệp với lệnh sau:
nano testsite/settings/production.py
Sau đó, thêm đoạn mã sau.
Tệp production.py sẽ tương tự như development.py, nhưng với cấu hình cơ sở dữ liệu khác và giá trị DEBUG được đặt thành False.
import os
from .base import *
import environ
env = environ.Env()
environ.Env.read_env()
DEBUG = False
ALLOWED_HOSTS = []
DATABASES = {
'default': {
'ENGINE': env('SQL_ENGINE', default='django.db.backends.sqlite3'),
'NAME': env('SQL_DATABASE', default=os.path.join(BASE_DIR, 'db.sqlite3')),
'USER': env('SQL_USER', default='user'),
'PASSWORD': env('SQL_PASSWORD', default='password'),
'HOST': env('SQL_HOST', default='localhost'),
'PORT': env('SQL_PORT', default=''),
}
}
Lưu và đóng tệp bằng cách nhấn CTRL+X, sau đó nhấn Y và ENTER.
Với ví dụ cấu hình cơ sở dữ liệu đã cho, bạn có thể dùng tệp .env để cấu hình cho từng thông tin xác thực, kèm giá trị mặc định. Giả sử bạn đã thiết lập xong cơ sở dữ liệu cho phiên bản production của dự án, hãy sử dụng cấu hình thực tế của bạn thay cho ví dụ minh họa.
Đến đây, bạn đã cấu hình dự án để sử dụng các thiết lập khác nhau dựa trên giá trị DJANGO_SETTINGS_MODULE trong tệp .env. Với ví dụ cấu hình trên, khi bạn chuyển sang dùng thiết lập production, giá trị DEBUG là False, ALLOWED_HOSTS được định nghĩa, và bạn có thể bắt đầu sử dụng cơ sở dữ liệu khác đã cấu hình sẵn trên máy chủ.
Bước 4: Làm việc với các thiết lập bảo mật của Django
Django cung cấp nhiều thiết lập bảo mật mà bạn có thể bổ sung vào dự án của mình. Trong bước này, bạn sẽ thêm các thiết lập bảo mật được cho là thiết yếu cho bất kỳ dự án nào triển khai ra môi trường sản xuất. Các thiết lập này chỉ nên áp dụng khi dự án đã công khai, và không nên sử dụng trong môi trường phát triển. Vì vậy, chúng ta sẽ giới hạn các thiết lập này trong tệp production.py.
Quan trọng nhất là hầu hết các thiết lập này bắt buộc sử dụng HTTPS cho nhiều thành phần của web như cookie phiên, cookie CSRF, tự động chuyển hướng HTTP sang HTTPS,… Do đó, nếu bạn chưa cấu hình tên miền trỏ về máy chủ, hãy tạm thời bỏ qua phần này. Nếu cần hướng dẫn triển khai máy chủ, hãy tham khảo phần Kết luận để tìm các bài viết liên quan.
Mở tệp production.py:
nano testsite/settings/production.py
Trong tệp này, thêm các thiết lập bảo mật được nêu dưới đây, điều chỉnh lại cho phù hợp với dự án của bạn:
import os
from .base import *
import environ
env = environ.Env()
environ.Env.read_env()
DEBUG = False
ALLOWED_HOSTS = ['your_domain', 'www.your_domain']
DATABASES = {
'default': {
'ENGINE': env('SQL_ENGINE', default='django.db.backends.sqlite3'),
'NAME': env('SQL_DATABASE', default=os.path.join(BASE_DIR, 'db.sqlite3')),
'USER': env('SQL_USER', default='user'),
'PASSWORD': env('SQL_PASSWORD', default='password'),
'HOST': env('SQL_HOST', default='localhost'),
'PORT': env('SQL_PORT', default=''),
}
}
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_BROWSER_XSS_FILTER = True
ALLOWED_HOSTSlà một danh sách các chuỗi ký tự, đại diện cho các tên host/domain mà dự án của bạn có thể xử lý yêu cầu. Đây là một biện pháp bảo mật để ngăn chặn kẻ tấn công thực hiện tấn công cache poisoning và DNS.SECURE_SSL_REDIRECTchuyển hướng tất cả các yêu cầu HTTP sang HTTPS (trừ khi được miễn trừ). Điều này có nghĩa là dự án của bạn sẽ luôn cố gắng sử dụng một kết nối được mã hóa. Bạn sẽ cần phải cấu hình SSL trên máy chủ của mình để thiết lập này hoạt động. Lưu ý, nếu bạn đã cấu hình Nginx hoặc Apache để thực hiện việc chuyển hướng sang HTTPS, thì thiết lập này sẽ không còn cần thiết.SESSION_COOKIE_SECUREbáo cho trình duyệt rằng cookie chỉ có thể được xử lý qua kết nối HTTPS. Điều này có nghĩa là các cookie mà dự án của bạn tạo ra cho các hoạt động như đăng nhập sẽ chỉ hoạt động qua một kết nối được mã hóa.CSRF_COOKIE_SECUREtương tự nhưSESSION_COOKIE_SECUREnhưng áp dụng cho token CSRF. Token CSRF giúp ngăn chặn các cuộc tấn công giả mạo yêu cầu liên trang (cross-site request forgery). Cơ chế bảo vệ CSRF của Django đảm bảo rằng bất kỳ biểu mẫu nào được gửi đến dự án của bạn (đăng nhập, đăng ký, v.v.) đều được tạo ra bởi chính dự án, chứ không phải từ một bên thứ ba.SECURE_BROWSER_XSS_FILTERđặt headerX-XSS-Protection: 1; mode=blockcho tất cả các phản hồi nếu header này chưa được thiết lập trước đó. Điều này đảm bảo các bên thứ ba không thể chèn mã độc vào dự án của bạn. Ví dụ, nếu một người dùng lưu một đoạn script vào cơ sở dữ liệu của bạn thông qua một trường công khai, khi đoạn script đó được truy xuất và hiển thị cho người dùng khác, nó sẽ không được thực thi.
Lưu và đóng tệp bằng cách nhấn CTRL+X, nhấn Y để lưu, và sau đó nhấn ENTER.
Nếu bạn muốn đọc thêm về các thiết lập bảo mật khác có sẵn trong Django, hãy xem thêm tài liệu của họ.
Cảnh báo: Tài liệu của Django nêu rõ rằng bạn không nên hoàn toàn dựa vào
SECURE_BROWSER_XSS_FILTER. Phải xác thực và làm sạch dữ liệu đầu vào.
Thiết lập bổ sung
Các cài đặt sau đây dùng để hỗ trợ Bảo mật Truyền tải Nghiêm ngặt HTTP (HSTS), tức là toàn bộ trang web của bạn phải luôn sử dụng SSL.
SECURE_HSTS_SECONDSxác định khoảng thời gian (tính bằng giây) áp dụng chính sách HSTS. Ví dụ, nếu đặt giá trị này là một giờ, mỗi khi người dùng truy cập một trang trên website, trình duyệt sẽ được thông báo rằng trong vòng một giờ tiếp theo, chỉ được phép truy cập trang thông qua HTTPS. Nếu trong khoảng thời gian này người dùng cố gắng truy cập vào HTTP của trang, trình duyệt sẽ hiển thị lỗi và từ chối tải trang.SECURE_HSTS_PRELOADchỉ có tác dụng khiSECURE_HSTS_SECONDSđược thiết lập. Header này cho phép trình duyệt tải trước (preload) website của bạn. Nghĩa là trang web của bạn sẽ được thêm vào một danh sách được mã hóa cứng (hard-coded), được tích hợp trong các trình duyệt phổ biến như Firefox và Chrome. Điều này yêu cầu trang web của bạn phải luôn được mã hóa. Tuy nhiên, cần đặc biệt thận trọng khi bật tùy chọn này, vì nếu sau này bạn ngừng sử dụng HTTPS, việc gỡ (thủ công) trang web khỏi danh sách preload HSTS có thể mất hàng tuần.SECURE_HSTS_INCLUDE_SUBDOMAINSáp dụng header HSTS cho tất cả các subdomain. Kích hoạt header này có nghĩa là cảyour_domainvàunsecure.your_domainđều sẽ yêu cầu mã hóa, ngay cả khiunsecure.your_domainkhông liên quan đến dự án Django này.
Cảnh báo:
Việc cấu hình sai các thiết lập bổ sung này có thể khiến trang web của bạn bị gián đoạn truy cập trong thời gian dài.
Hãy đọc kỹ tài liệu Django về HSTS trước khi áp dụng.
Cần phải xem xét các cài đặt này sẽ hoạt động như thế nào với dự án Django của riêng bạn; nhìn chung, cấu hình được thảo luận ở đây là một nền tảng tốt cho hầu hết các dự án Django. Tiếp theo, bạn sẽ xem xét một số cách sử dụng khác của .env.
Bước 5: Sử dụng django-environ để ẩn thông tin bí mật
Phần cuối của hướng dẫn này sẽ giúp bạn tận dụng django-environ để ẩn các thông tin nhạy cảm, chẳng hạn như SECRET_KEY của dự án hoặc URL đăng nhập của trang quản trị. Phương pháp này rất hữu ích nếu bạn dự định công khai mã nguồn trên các nền tảng như GitHub hoặc GitLab, vì các thông tin bí mật này sẽ không bị lộ.
Thay vào đó, mỗi khi bạn thiết lập dự án ban đầu trên môi trường local hoặc trên server, bạn có thể tạo một tệp .env mới để định nghĩa các biến bí mật đó.
Trong phần này, bạn sẽ bắt đầu với việc bảo mật SECRET_KEY.
Hãy mở tệp .env nằm ở thư mục gốc của dự án.
nano .env
Và thêm dòng sau vào, đảm bảo thay thế your_secret_key bằng chuỗi bí mật của riêng bạn:
DJANGO_SETTINGS_MODULE="testsite.settings.development"
SECRET_KEY="your_secret_key"
Sau đó, lưu và đóng tệp bằng cách nhấn CTRL+X, sau đó nhấn Y để lưu, và cuối cùng nhấn ENTER.
Mở tệp base.py:
nano testsite/settings/base.py
Cập nhật dòng khai báo SECRET_KEY như sau:
import environ
env = environ.Env()
environ.Env.read_env()
SECRET_KEY = env('SECRET_KEY')
Lưu ý: Không nên thay thế khóa bí mật trực tiếp vào SECRET_KEY. Biến SECRET_KEY cần được giữ nguyên và giá trị khóa bí mật thực tế sẽ được thêm vào tệp .env.
Sau đó, lưu và đóng tệp bằng cách nhấn CTRL+X, nhấn Y để lưu, rồi nhấn ENTER. Lúc này, dự án của bạn sẽ sử dụng giá trị SECRET_KEY từ tệp .env.
Cuối cùng, bạn sẽ ẩn đường dẫn truy cập trang quản trị (admin URL) bằng cách thêm một chuỗi ký tự ngẫu nhiên thật dài vào đường dẫn. Thay vì truy cập vào your_domain/admin, bạn sẽ truy cập your_domain/very_secret_url/admin. Cách này giúp bot hoặc người lạ khó tìm được trang quản trị, từ đó giảm nguy cơ bị tấn công brute force vào tài khoản quản trị.
Mở lại tệp .env:
nano .env
Thêm dòng sau vào biến SECRET_ADMIN_URL:
DJANGO_SETTINGS_MODULE="testsite.settings.development"
SECRET_KEY="your_secret_key"
SECRET_ADMIN_URL="very_secret_url"
Lưu và đóng tệp bằng cách nhấn CTRL+X, nhấn Y để lưu, rồi nhấn ENTER.
Bây giờ, bạn sẽ cấu hình Django để ẩn đường dẫn truy cập trang quản trị bằng biến SECRET_ADMIN_URL:
nano testsite/urls.py
Lưu ý: Đừng quên thay very_secret_url bằng đường dẫn bí mật của riêng bạn.
Nếu muốn sử dụng chuỗi ngẫu nhiên cho biến này, Python cung cấp thư viện secrets.py để tạo ra các chuỗi bảo mật ngẫu nhiên. Các ví dụ trong tài liệu của thư viện này là nguồn tham khảo hữu ích để viết các chương trình Python nhỏ phục vụ việc tạo chuỗi bảo mật ngẫu nhiên.
Chỉnh sửa lại đường dẫn đến admin:
from django.contrib import admin
from django.urls import path
import environ
env = environ.Env()
environ.Env.read_env()
urlpatterns = [
path(env('SECRET_ADMIN_URL') + '/admin/', admin.site.urls),
]
Lưu và đóng tệp bằng cách nhấn CTRL+X, nhấn Y để lưu, rồi nhấn ENTER.
Giờ đây, trang quản trị admin sẽ chỉ có thể truy cập qua /very_secret_url/admin/ thay vì /admin/ :

Kết luận
Trong bài hướng dẫn này, bạn đã cấu hình dự án Django hiện tại để có thể dễ dàng vận hành trên nhiều môi trường khác nhau. Dự án hiện sử dụng django-environ để quản lý thông tin bí mật và các cài đặt, đồng thời đã kích hoạt các tính năng bảo mật tích hợp sẵn của Django cho môi trường sản xuất.
Nếu bạn đã áp dụng đầy đủ các thành phần bảo mật được đề xuất và triển khai lại cấu hình theo hướng dẫn, dự án của bạn hiện có các đặc điểm chính sau:
- Sử dụng SSL/HTTPS cho toàn bộ giao tiếp (bao gồm subdomain, cookie, CSRF).
- Ngăn chặn tấn công XSS (Cross-Site Scripting).
- Ngăn chặn tấn công CSRF (Cross-Site Request Forgery).
- Bảo mật khóa bí mật (secret key) của dự án.
- Ẩn URL đăng nhập trang quản trị, giảm nguy cơ tấn công brute-force.
- Phân tách cài đặt cho môi trường phát triển và sản xuất.