Bài viết này sẽ giới thiệu về lỗ hổng CSRF và cách sử dụng các decorator trong Django để bảo vệ ứng dụng web.
Tổng Quan Về CSRF
CSRF (Cross-Site Request Forgery) là một dạng tấn công mà kẻ xấu lợi dụng danh tính của người dùng đã đăng nhập để gửi các yêu cầu không mong muốn đến trang web. Tấn công CSRF khác với XSS ở chỗ nó dựa vào việc giả mạo yêu cầu từ người dùng đáng tin cậy thay vì khai thác lỗi trên trang web.
Các Biện Pháp Phòng Chống CSRF
Để phòng chống CSRF, bạn có thể áp dụng các biện pháp như sau:
- Sử dụng token bí mật trong form để xác thực yêu cầu.
- Áp dụng phương pháp "double submit cookie" nhằm đảm bảo rằng các yêu cầu chỉ được chấp nhận khi xuất phát từ cùng một domain.
- Không nên sử dụng phương thức GET cho các hành động thay đổi trạng thái hệ thống, mà nên sử dụng POST.
Sử Dụng CSRF Trong Django
Django cung cấp các công cụ tích hợp để giúp bảo vệ ứng dụng khỏi các cuộc tấn công CSRF. Để cấu hình, bạn cần đảm bảo middleware CSRF được kích hoạt trong file settings.py.
Decorator CSRF Trong Django
from django.views.decorators.csrf import csrf_exempt, csrf_check, ensure_token
# Ví dụ: Bỏ qua kiểm tra CSRF
@csrf_exempt
def my_view(request):
pass
# Ví dụ: Yêu cầu kiểm tra CSRF
@csrf_check
def secure_view(request):
pass
# Ví dụ: Đảm bảo cookie CSRF được tạo
@ensure_token
def view_with_cookie(request):
pass
Ví Dụ Không Kiểm Tra CSRF
from django.views import View
from django.utils.decorators import method_decorator
class ExampleView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
pass
def post(self, request, *args, **kwargs):
pass
Ví Dụ Yêu Cầu Kiểm Tra CSRF
@method_decorator(ensure_token)
def safe_get(self, request, *args, **kwargs):
pass
@method_decorator(csrf_check)
def safe_post(self, request, *args, **kwargs):
pass
Quy Trình Thực Hiện CSRF
- Lấy giá trị csrftoken từ cookie.
- Chèn giá trị csrftoken vào request.META.
- Kiểm tra xem view có sử dụng decorator
csrf_exempthay không. - Nếu là phương thức GET, HEAD, OPTIONS hoặc TRACE thì bỏ qua kiểm tra CSRF.
- Đối với các phương thức khác, lấy giá trị token từ cookie hoặc header và so sánh với giá trị trong request.