Trình kiểm thử CORS

Tiếp theo

Lỗi CORS thường biểu hiện dưới dạng màu đỏ đặc trưng trên giao diện điều khiển trình duyệt: khi truy cập một API từ nguồn khác, trình duyệt sẽ chặn phản hồi. Công cụ kiểm thử này sẽ gửi một yêu cầu preflight OPTIONS đến bất kỳ địa chỉ URL nào bạn nhập, với nguồn gốc và phương thức bạn chọn, sau đó giải mã các tiêu đề Access-Control-* để bạn có thể xác định chính xác máy chủ cho phép điều gì, chặn điều gì, và lý do tại sao trình duyệt báo lỗi.

Cách kiểm thử CORS

  1. 1

    Nhập địa chỉ URL mục tiêu

    Điểm cuối API mà bạn muốn gọi từ giao diện phía trước. Hãy nhập chuỗi truy vấn và ghi rõ giao thức sử dụng.

  2. 2

    Thiết lập phương thức và nguồn gốc

    GET/POST/PUT/DELETE/PATCH. Nguồn gốc có thể là địa chỉ URL của trang web bạn hoặc bất kỳ nguồn gốc nào bạn muốn mô phỏng.

  3. 3

    Hiểu về preflight

    Công cụ luôn gửi một yêu cầu OPTIONS với nguồn gốc và phương thức bạn chọn, kèm tiêu đề Access-Control-Request-Headers: Content-Type, đúng như preflight mà trình duyệt gửi trước một yêu cầu JSON.

  4. 4

    Thực hiện bài kiểm tra

    Công cụ gửi preflight và báo cáo trạng thái HTTP cùng các tiêu đề phản hồi CORS: Allow-Origin, Allow-Methods, Allow-Headers, Allow-Credentials và Max-Age.

  5. 5

    Sửa lỗi cấu hình không đúng

    Báo cáo chỉ ra những điều thiếu hoặc không chính xác: trường Allow-Origin bị thiếu, tiêu đề bị cấm, hoặc phương thức không được phép.

Các tiêu đề quan trọng

Tiêu đề Chức năng
Access-Control-Allow-Origin Những origin nào có thể đọc phản hồi
Access-Control-Allow-Methods Preflight: những phương thức nào được phép
Access-Control-Allow-Headers Preflight: những tiêu đề yêu cầu nào được phép
Access-Control-Allow-Credentials Có cho phép cookie/xác thực hay không
Access-Control-Expose-Headers Những tiêu đề phản hồi nào JS có thể đọc
Access-Control-Max-Age Kết quả preflight được lưu cache trong bao lâu

Yêu cầu đơn giản so với yêu cầu cần preflight

Một yêu cầu chỉ được coi là “đơn giản” (không cần preflight) khi tất cả các điều kiện sau đều đúng:

  • Phương thức là GET, HEAD hoặc POST.
  • Các tiêu đề chỉ giới hạn ở Accept, Accept-Language, Content-Language, Content-Type (với các giá trị cụ thể).
  • Content-Type, nếu có, là application/x-www-form-urlencoded, multipart/form-data hoặc text/plain.

Bất kỳ thứ gì khác, nội dung JSON, tiêu đề Authorization, tiêu đề tùy chỉnh X-Foo, hoặc PUT/DELETE/PATCH, đều kích hoạt một preflight OPTIONS. Máy chủ phải trả lời preflight bằng các tiêu đề Allow-* phù hợp, nếu không yêu cầu thực sự sẽ không bao giờ được gửi đi.

Các lỗi CORS thường gặp

  • “No Access-Control-Allow-Origin header” → máy chủ không thiết lập tiêu đề này. Hãy khắc phục ở phía máy chủ, không phải phía client.
  • “Credentials mode requires Allow-Origin not to be *” → nếu bạn gửi cookie, Allow-Origin phải là một origin cụ thể (hoặc phản chiếu lại tiêu đề Origin).
  • “Request header X not allowed” → thêm X vào Access-Control-Allow-Headers trong phản hồi preflight.
  • “Method not allowed” → thêm phương thức đó vào Access-Control-Allow-Methods.
  • “Redirect not allowed in preflight” → preflight không thể đi theo chuyển hướng. Endpoint OPTIONS phải phản hồi trực tiếp.

Allow-Origin: * so với phản chiếu Origin

Access-Control-Allow-Origin: * rất thoáng nhưng không thể kết hợp với thông tin xác thực. Trong môi trường production, hãy phản chiếu lại Origin của yêu cầu (sau khi đã xác thực với một danh sách cho phép) và đặt Allow-Credentials: true nếu bạn cần cookie.

Dùng proxy như một giải pháp thay thế

Nếu bạn không kiểm soát được máy chủ, một proxy mỏng trên chính tên miền của bạn sẽ loại bỏ hoàn toàn CORS, trình duyệt sẽ thấy đó là same-origin. Nhiều nền tảng lưu trữ (Vercel, Netlify, Cloudflare) cung cấp các quy tắc rewrite đúng cho mục đích này.

Câu hỏi thường gặp

Để ngăn chặn một trang độc hại đọc dữ liệu riêng tư trên một trang web khác thông qua các cookie của trình duyệt bạn, nếu không sử dụng CORS thì việc truy cập vào evil.com có thể cho phép trang đó yêu cầu truy cập API nội bộ của ngân hàng bạn dưới danh nghĩa của bạn. CORS buộc ngân hàng phải cho phép rõ ràng việc truy xuất dữ liệu từ nhiều nguồn khác nhau (cross-origin).

Chỉ trong quá trình phát triển. Chromium có cờ --disable-web-security, nhưng cờ này ảnh hưởng đến tất cả các trang web và rất nguy hiểm. Giải pháp đúng đắn là dùng tiêu đề ở phía máy chủ hoặc một proxy.

Postman không phải là trình duyệt – nó hoàn toàn bỏ qua CORS. CORS chỉ được các trình duyệt áp dụng đối với các yêu cầu JavaScript. Một máy chủ hoạt động trong Postman không tự động đáp ứng đúng yêu cầu về CORS.

Các hình ảnh và thẻ định danh cổ điển <script> có thể được tải từ các nguồn khác nhau mà không yêu cầu CORS, nhưng JavaScript không thể đọc nội dung của chúng. Trong khi đó, các thẻ <img crossorigin>fetch() bắt buộc phải sử dụng CORS; chính vì vậy, các hình ảnh được vẽ bằng Canvas sẽ bị “bị nhiễm” nếu không áp dụng CORS.

Công cụ liên quan