Bộ phân tích tiêu đề HTTP

Dán toàn bộ một yêu cầu hoặc phản hồi HTTP — khối mà curl -v in ra, hoặc những gì bảng Network của trình duyệt hiển thị — và mọi dòng header sẽ được giải mã: tên, giá trị, một câu giải thích bằng tiếng Việt đơn giản về nó làm gì, và tài liệu định nghĩa nó. Set-Cookie được tách ra từng thuộc tính (Secure, HttpOnly, SameSite, Max-Age, Expires…), các tham số của Content-Type và Accept được mở rộng, và khối được kiểm tra các lỗi cấu trúc kinh điển: dòng gấp đã lỗi thời, ký tự không hợp lệ, header trùng lặp và header gửi sai chiều. Mọi thứ chạy trong trình duyệt của bạn và không có gì được tải lên.
Tự động xem dòng đầu tiên: một dòng yêu cầu (GET /path HTTP/1.1) nghĩa là yêu cầu, một dòng trạng thái (HTTP/1.1 200 OK) nghĩa là phản hồi, còn lại được đọc như một khối header trần. Các lựa chọn khác buộc chiều, và điều đó thay đổi cảnh báo nào được áp dụng.
Chưa phân tích gì. Dán một khối yêu cầu hoặc phản hồi ở trên rồi nhấn Phân tích header, hoặc nhấn Mẫu để xem một ví dụ.
Lấy khối đáng phân tích ở đâu. Trong terminal, curl -v https://example.com/ 2>&1 in ra yêu cầu và phản hồi với tiền tố > và < — hãy bỏ các tiền tố đó rồi dán. curl -sI https://example.com/ chỉ cho khối header phản hồi. Trong trình duyệt, mở công cụ nhà phát triển, tab Network, tải lại, chọn yêu cầu tài liệu và dùng Sao chép → Sao chép header phản hồi; với phía yêu cầu, dùng Sao chép dạng cURL và đọc các cờ. Một khối trần gồm các dòng Tên: giá trị không có dòng khởi đầu cũng được phân tích — khi đó các kiểm tra chiều được nới lỏng.
Tự kiểm tra
Chạy lại trình phân tích trên các khối cố định: nhận diện chiều, cả hai bộ mẫu, mọi quy tắc thuộc tính Set-Cookie (SameSite=None không có Secure, Max-Age không phải số, Expires hỏng, thuộc tính không rõ, cookie không có dấu bằng), nối obs-fold, tên trường không hợp lệ, header trùng lặp, không khớp chiều và các đường đi âm tính. Không có gì được gửi đi đâu cả.
HTTP header là gì?
Trong một câu: một thông điệp HTTP gồm một dòng khởi đầu, một khối các dòng Tên: giá trị gọi là header, một dòng trống, và thân tùy chọn — các header mang mọi thông tin về thông điệp ngoại trừ chính phần thân: ai gửi, nó có thể chấp nhận gì, cách nó được cache, cách nó được xác thực và người gửi muốn nhận lại gì.
Bốn họ header
HọĐi theoVí dụTrả lời câu hỏi
Header yêu cầuclient → serverHost, Accept, Cookie, Referer, Authorizationclient muốn gì và tự nhận mình là ai
Header phản hồiserver → clientLocation, Server, Set-Cookie, Retry-Afterserver đã làm gì và yêu cầu lại điều gì
Header biểu diễncả hai, về thân thông điệpContent-Type, Content-Length, Content-Encoding, ETagthân ở định dạng nào và đây là bản nào của nó
Header điều khiểncả hai, về kết nốiCache-Control, Connection, Via, Transfer-Encodingthông điệp và kết nối được xử lý thế nào trên đường đi

Một số header chắc chắn chỉ đi một chiều: If-None-Match chỉ có nghĩa trong yêu cầu và Set-Cookie chỉ có nghĩa trong phản hồi. Phân tích sai chiều là một trong các lỗi gỡ rối copy-paste kinh điển, đó là lý do trang này đánh dấu nó.

Cú pháp của một dòng header

RFC 9110 định nghĩa một dòng trường là field-name ":" OWS field-value OWS — tên chỉ gồm ký tự token (chữ cái, chữ số và !#$%&'*+-.^_`|~), dấu hai chấm không có khoảng trắng trước nó, và giá trị gồm ký tự hiển thị, khoảng trắng và tab. Tên header không phân biệt hoa thường (content-type bằng Content-Type); giá trị hầu như luôn phân biệt hoa thường. Một dòng bắt đầu bằng khoảng trắng hoặc tab từng nối tiếp header trước — obs-fold, đã lỗi thời từ 2014: một proxy giải gấp có thể làm thay đổi nghĩa của header, nên trình phân tích ở đây nối nó nhưng cảnh báo bạn rằng nó tồn tại.

Những lỗi thường gặp
  • Tin tưởng X-Forwarded-For. Nó được mọi proxy trên đường đi thêm vào, và client có thể giả mạo hop đầu tiên. Nó cho bạn biết một chuỗi proxy khai báo điều gì, chứ không phải ai đang kết nối; hãy coi nó là gợi ý, và ưu tiên một proxy bạn kiểm soát để ghi đè nó.
  • Chỉ đọc header phản hồi. Một nửa các lỗi thú vị (một Accept bị trùng, thiếu Host, header authorization gửi nhầm host) nằm trong yêu cầu, mà trình duyệt mặc định ẩn đi. Hãy dùng Sao chép dạng cURL để xem yêu cầu của chính bạn.
  • Gộp các dòng Set-Cookie. Hầu hết header trùng lặp có thể gộp bằng dấu phẩy — nhưng Set-Cookie thì không được, vì dấu phẩy xuất hiện ngay trong giá trị. Trình duyệt coi mỗi dòng là một cookie riêng.
  • Kỳ vọng Content-Length bằng kích thước thân bạn đã viết. Nó là kích thước sau khi áp dụng Content-Encoding, và chỉ khi thông điệp không chunked; một phản hồi Transfer-Encoding: chunked không có độ dài đơn có ý nghĩa.
  • Đánh giá header theo tiền tố X-. Quy ước này đã bị loại bỏ trong RFC 6648: X-Forwarded-For và X-Content-Type-Options là tiêu chuẩn thực tế lâu dài, trong khi rất nhiều header không có X là thử nghiệm. Hãy đánh giá theo tài liệu định nghĩa, không theo tiền tố.
Câu hỏi thường gặp

Dán header ở đây có an toàn không? Việc phân tích diễn ra hoàn toàn trong trình duyệt của bạn và không có gì được tải lên. Dù vậy, một khối header đã sao chép chính là một dấu vân tay: cookie, header authorization và User-Agent chính xác cùng nhau có thể nhận diện bạn, nên hãy chỉ phân tích những khối bạn không ngại cho đồng nghiệp xem.

Vì sao trình duyệt của tôi hiển thị các header như :status mà trang này gọi là lỗi? Đó là pseudo-header của HTTP/2 và HTTP/3 — các lớp khung nhị phân thay dòng khởi đầu và Host bằng các trường giả. Trang này phân tích văn bản HTTP/1.1 kiểu cổ điển; pseudo-header chính là cùng thông tin sau khi giao thức đã chuyển đổi.

Còn X-XSS-Protection thì sao? Nó đã bị loại bỏ: bộ kiểm tra mà nó điều khiển tự gây ra các lỗi bảo mật và trình duyệt đã gỡ bỏ nó. Vai trò của nó thuộc về Content-Security-Policy — hãy tạo một chính sách tại Trình tạo CSP và kiểm tra toàn bộ bộ header tại Trình kiểm tra security header.

Thuộc tính Set-Cookie được kiểm tra thế nào? Theo RFC 6265: tên và giá trị được tách tại dấu bằng đầu tiên, các thuộc tính sau dấu chấm phẩy đầu tiên, Expires phải là một ngày theo định dạng cookie, Max-Age là chữ số, SameSite là một trong Strict/Lax/None — và None không kèm Secure bị các trình duyệt hiện tại từ chối, nên được nêu rõ.

Tôi có thể chỉ phân tích một danh sách dòng header không? Có — chọn Chỉ khối header và dán không có dòng khởi đầu. Các kiểm tra chiều được nới lỏng; mọi thứ khác (cấu trúc, Set-Cookie, tham số) vẫn chạy.