TLDR: Không có gì ngăn chặn mã độc từ giả mạo nguồn gốc. Khi điều đó xảy ra, máy chủ của bạn sẽ không bao giờ biết về nó và sẽ hành động theo yêu cầu. Đôi khi những yêu cầu đó là đắt tiền. Vì vậy, không sử dụng CORS thay cho bất kỳ loại bảo mật nào.
Gần đây tôi đã chơi xung quanh với CORS và tôi đã tự hỏi mình câu hỏi tương tự. Những gì tôi đã tìm thấy là trình duyệt có thể đủ thông minh để biết yêu cầu CORS giả mạo khi thấy yêu cầu, nhưng máy chủ của bạn không thông minh.
Điều đầu tiên tôi tìm thấy là Origin
tiêu đề là tên tiêu đề bị cấm HTTP không thể sửa đổi theo chương trình. Điều đó có nghĩa là bạn có thể sửa đổi nó trong khoảng 8 giây bằng cách sử dụng Tiêu đề sửa đổi cho Google Chrome .
Để kiểm tra điều này, tôi thiết lập hai miền Máy khách và một miền Máy chủ. Tôi đã bao gồm một danh sách trắng CORS trên Máy chủ, cho phép các yêu cầu CORS từ Máy khách 1 nhưng không phải từ Máy khách 2. Tôi đã thử nghiệm cả hai máy khách và thực sự các yêu cầu CORS của Máy khách 1 đã thành công trong khi Máy khách 2 không thành công.
Sau đó, tôi giả mạo Origin
tiêu đề của Client 2 để khớp với Client 1. Máy chủ đã nhận được Origin
tiêu đề giả mạo và đã vượt qua kiểm tra danh sách trắng (hoặc thất bại nếu bạn là một anh chàng nửa người nửa ly). Sau đó, Máy chủ đã thực hiện một cách nghiêm túc bằng cách tiêu thụ tất cả các tài nguyên mà nó được thiết kế để tiêu thụ (cuộc gọi cơ sở dữ liệu, gửi email đắt tiền, gửi tin nhắn sms thậm chí còn đắt hơn, v.v.). Khi đã xong, máy chủ vui vẻ gửi Access-Control-Allow-Origin
tiêu đề giả mạo trở lại trình duyệt.
Tài liệu tôi đã đọc nói rằng Access-Control-Allow-Origin
giá trị nhận được phải khớp Origin
chính xác với giá trị được gửi trong yêu cầu. Chúng khớp nhau, vì vậy tôi rất ngạc nhiên khi thấy thông báo sau trong Chrome:
XMLHttpRequest không thể tải http://server.dev/test
. Tiêu đề 'Kiểm soát truy cập-Cho phép-Xuất xứ' có giá trị http://client1.dev
không bằng nguồn gốc được cung cấp. Nguồn gốc http://client2.dev
do đó không được phép truy cập.
Các tài liệu tôi đọc dường như không chính xác. Tab mạng của Chrome hiển thị rõ ràng cả tiêu đề yêu cầu và phản hồi http://client1.dev
, nhưng bạn có thể thấy trong lỗi mà Chrome bằng cách nào đó biết nguồn gốc thực sự http://client2.dev
và từ chối chính xác phản hồi. Điều này không thành vấn đề tại thời điểm này vì máy chủ đã chấp nhận yêu cầu giả mạo và tiêu tiền của tôi.
foo.com
) phải cung cấpAccess-Control-Allow-Origin
tiêu đề nếu không trình duyệt không cho phép yêu cầubar.com
.