Trình kiểm thử CORS
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
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
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
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
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
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-Originphả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-Headerstrong 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> và 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
Tìm địa chỉ IP
Tra cứu địa chỉ IPv4 hoặc IPv6 công khai để xem quốc gia, khu vực, thành phố, tọa độ, ISP, ASN, tổ chức và múi giờ ước tính.
Trình phân tích tiêu đề email
Phân tích riêng tư tiêu đề email thô ngay trong trình duyệt. Xem các chặng Received, thời gian và siêu dữ liệu SPF, DKIM, DMARC, ARC mà không tải thư lên.
Tra cứu DNS ngược
Tra cứu bản ghi PTR cho địa chỉ IPv4 hoặc IPv6. Hữu ích khi gỡ lỗi máy chủ email, phân tích log và điều tra bộ lọc spam.
Kiểm tra tốc độ
Chạy kiểm tra tốc độ internet nhanh, miễn phí ngay trong trình duyệt. Đo tốc độ tải xuống theo Mbps cùng với độ trễ và độ rung (jitter), và xem kết nối của bạn có sẵn sàng cho streaming 4K, chơi game và gọi video hay không. Không cần ứng dụng, không cần đăng ký.
Trình kiểm tra endpoint API
Kiểm tra endpoint HTTP hoặc HTTPS cho phép CORS ngay trong trình duyệt. Xem trạng thái cuối, header được công khai, thời gian và bản xem trước body có giới hạn.
IP của tôi là gì
Xem địa chỉ IP mà máy chủ này nhận được cho yêu cầu của bạn, đó là IPv4 hay IPv6 và, khi có dữ liệu GeoIP cục bộ, một quốc gia gần đúng.