3 điểm bởi GN⁺ 2024-11-22 | 1 bình luận | Chia sẻ qua WhatsApp
  • Cookie HTTP: những mẩu dữ liệu nhỏ được dùng để duy trì trạng thái trên web; sau khi được trình duyệt thiết lập, chúng sẽ được gửi kèm trong mọi yêu cầu HTTP cho đến khi hết hạn.
  • Phát sinh vấn đề: một đoạn mã JavaScript cụ thể đã gây lỗi vì không thể phân tích cookie trong thư viện chuẩn của Go.

Đặc tả

  • RFC 2109, 2965, 6265: các định nghĩa ban đầu và các bản cập nhật của cookie. Đặc tả về giá trị cookie không nhất quán giữa máy chủ và trình duyệt.
  • Vấn đề:
    1. Những gì máy chủ phải gửi và những gì trình duyệt phải chấp nhận không khớp nhau.
    2. Không có giới hạn nào cho giá trị cookie mà trình duyệt gửi về máy chủ.
    3. Không có hướng dẫn rõ ràng về cách thư viện chuẩn nên xử lý header cookie.

Trình duyệt web

  • Firefox: cho phép một số ký tự mà RFC không khuyến nghị.
  • Chromium: hạn chế hơn Firefox một chút, nhưng vẫn cho phép nhiều ký tự.
  • Safari: khi gặp ký tự không được phép, nó không dừng xử lý cookie mà chấp nhận giá trị đến ngay trước ký tự đó.

Thư viện chuẩn

  • Golang: hoạt động tương tự RFC, nhưng cho phép khoảng trắng và dấu phẩy.
  • PHP: phát sinh lỗi ở một số ký tự điều khiển nhất định.
  • Python: bỏ qua những cookie mà nó không hiểu và ngừng nạp thêm cookie.
  • Ruby: chấp nhận mọi ký tự và mã hóa phần trăm chúng.
  • Rust: chấp nhận mọi chuỗi UTF-8.

Tầm quan trọng với web

  • Vấn đề thực tế: do đặc tả mơ hồ, rất nhiều website có thể dễ dàng phát sinh lỗi.
  • Giải pháp: IETF HTTP Working Group cần cập nhật đặc tả cookie và làm rõ cách trình duyệt cũng như ngôn ngữ lập trình nên xử lý cookie.

Bảng tóm tắt

  • Cách trình duyệt và ngôn ngữ xử lý cookie: mỗi trình duyệt và ngôn ngữ xử lý cookie theo cách khác nhau. Mức độ phù hợp với RFC cũng khác nhau.

1 bình luận

 
GN⁺ 2024-11-22
Ý kiến trên Hacker News
  • Cookie chứa nhiều vấn đề bất ngờ và hành vi khó chịu, nhưng vẫn hoạt động trong 99,95% trường hợp. Cookie shadowing là vấn đề xảy ra khi thiết lập các cookie có cùng tên nhưng thuộc tính khóa khác nhau (domain, path, v.v.), khiến backend hoặc JS không thể phân biệt được đó là cookie nào

  • Rust không có chức năng xử lý cookie trong thư viện chuẩn và tham khảo hành vi của crate "cookie" bên thứ ba. Cách này bao gồm tùy chọn mã hóa phần trăm như Ruby

  • Giao thức HTTP bao hàm rất nhiều giao thức khác, còn trình duyệt và web server thì bổ sung thêm nhiều tính năng khác nhau. Các tính năng này không có đặc tả rõ ràng, và client lẫn server cũng không thể chỉ định khả năng tương thích. Vì vậy rốt cuộc vẫn phải tiếp tục mang theo những quyết định sai lầm trong quá khứ

  • Khoảng 10 năm trước, khi triển khai session dựa trên cookie trong một dự án, đã gặp vấn đề hoạt động trên Safari nhưng không hoạt động trên Chrome. Nguyên nhân là do sự khác biệt ở chỗ trình duyệt sẽ không thiết lập cookie nếu định dạng không đúng

  • Cách dùng hợp lý duy nhất của cookie là thiết lập một opaque token để server có thể nhận diện client. Việc client xử lý được những giá trị mà server sẽ không gửi đi không phải là vấn đề

  • Cookie là một vấn đề phức tạp và gần như không thể thay đổi vì các vấn đề tương thích ngược. Cần phải tạo ra một cơ chế mới. Ví dụ, cơ chế NewCookie có thể đi kèm các biện pháp bảo mật hiện đại và đặc tả nghiêm ngặt

  • Cookie nên biến mất và có thể được thay thế bằng header xác thực. Sẽ rất tốt nếu trình duyệt có thể xác thực với website theo một cách chuẩn hóa. Thật đáng tiếc khi Basic và Digest authentication đã không đủ đáp ứng nhu cầu

  • Vì mã networking của Safari không phải mã nguồn mở, bản port Foundation của Swift có thể là một lựa chọn thay thế tốt. Ở đó có thể kiểm tra các ký tự điều khiển và ký tự xóa

  • Việc phân tích cú pháp header cookie rất hỗn loạn. “Tiêu chuẩn” thực tế không phản ánh những gì đang tồn tại, và mỗi backend server, thư viện hay framework lại chấp nhận những thứ khác nhau. Nếu có thể kiểm soát hoàn toàn frontend và backend thì không phải vấn đề lớn, nhưng khi phải tương tác với những thứ khác thì trở nên cực kỳ phức tạp

  • Khi thử nghiệm với ngôn ngữ Crystal cũng đã gặp vấn đề tương tự. Có ý định xây dựng một web scraper đơn giản, nhưng HTTP client mặc định không thể phân tích nhiều cookie được thiết lập trong response và bị dừng lại