2015-07-08 12 views
5

Bối cảnh: Tôi đã viết một ứng dụng Django mà bây giờ tôi đã triển khai tới Elastic Beanstalk (AWS).Tiêu đề tùy chỉnh thiếu trong các yêu cầu để Django

Trong phát triển địa phương, tôi đã sử dụng tiêu đề yêu cầu tùy chỉnh SESSION_TOKEN mà sau đó tôi có thể truy cập bằng cách sử dụng request.META.get('HTTP_SESSION_TOKEN'). Trong sản xuất tôi thấy lỗi vì tiêu đề đó không thể truy cập được (hay còn gọi là nó chỉ đơn giản là thiếu trong tất cả các yêu cầu máy chủ Django của tôi đang nhìn thấy).

Ngoài ra các tiêu đề chuẩn khác của tôi đang hoạt động tốt, nó chỉ là tiêu đề tùy chỉnh bị thiếu. Lưu ý Tôi không đặt HTTP_AUTHORIZATION, đây không phải là vấn đề tương tự như Authorization header missing in django rest_framework, is apache to blame?.

gì đang xảy ra vậy? Làm cách nào để truy cập các tiêu đề tùy chỉnh trên chương trình phụ trợ của tôi trong sản xuất?

Trả lời

12

Nhiều khả năng nhất là tiêu đề SESSION_TOKEN bị tước bởi một thứ gì đó. Từ Django security advisory:

Khi tiêu đề HTTP được đặt vào environ WSGI, họ được chuẩn hóa bằng cách chuyển đổi sang chữ hoa, chuyển đổi tất cả dấu gạch ngang để dấu gạch dưới, và thêm vào trước HTTP_. Ví dụ, một tiêu đề X-Auth-User sẽ trở thành HTTP_X_AUTH_USER trong môi trường WSGI (và do đó cũng trong từ điển request.META của Django). Thật không may, điều này có nghĩa rằng môi trường WSGI không thể phân biệt giữa các tiêu đề có dấu gạch ngang và các tiêu đề chứa dấu gạch dưới: X-Auth-User và X-Auth_User đều trở thành HTTP_X_AUTH_USER. Điều này có nghĩa là nếu tiêu đề được sử dụng theo cách bảo mật (ví dụ: truyền thông tin xác thực cùng với proxy phía trước), ngay cả khi proxy cẩn thận loại bỏ bất kỳ giá trị đến nào cho X-Auth-User, kẻ tấn công có thể có thể cung cấp tiêu đề X-Auth_User (có dấu gạch dưới) và bỏ qua bảo vệ này.

và bit quan trọng nhất của thông tin:

Để ngăn chặn các cuộc tấn công như vậy, cả hai Nginx và Apache 2.4+ tước tất cả các tiêu đề có chứa dấu gạch dưới từ yêu cầu gửi đến theo mặc định. Máy chủ phát triển tích hợp của Django bây giờ cũng vậy. Máy chủ phát triển của Django không được khuyến nghị sử dụng cho sản xuất, nhưng việc kết hợp hành vi của các máy chủ sản xuất thông thường làm giảm diện tích bề mặt cho các thay đổi hành vi trong quá trình triển khai.

Nếu bạn có bất kỳ tiêu đề tùy chỉnh nào, bạn nên sử dụng dấu nối thay thế.

+0

Đặt tiêu đề trong yêu cầu của tôi thành 'Mã phiên' và đọc chúng thành 'HTTP_SESSION_TOKEN' đã giải quyết vấn đề. Cảm ơn! – owencm

+0

bất kỳ lý do nào bạn không sử dụng ứng dụng phiên chuẩn của Django sử dụng cookie thay vì tiêu đề để chuyển id phiên. Điều đó có vẻ an toàn hơn vì bạn có thể chỉ định để sử dụng cookie chỉ trong các kết nối an toàn, vv (không phải 100% fool-proof nhưng ít nhất một cái gì đó của nó) – miki725

+0

tôi ban đầu được sử dụng Django như một backend API để một ứng dụng bản địa, vì vậy đây là điều hiển nhiên điều cần làm. Tôi đã kể từ khi chuyển sang xây dựng một khách hàng web, nhưng đã lo lắng về vấn đề CSRF với cookie và cách tiếp cận hiện tại của tôi đã làm việc tốt vì vậy tôi giữ nó :) – owencm

Các vấn đề liên quan