CORS có phải là cách an toàn để thực hiện các yêu cầu AJAX trên nhiều miền không?


81

Sau khi đọc về CORS (Chia sẻ tài nguyên đa nguồn gốc), tôi không hiểu nó cải thiện bảo mật như thế nào. Giao tiếp AJAX giữa nhiều miền được phép nếu tiêu đề GỐC chính xác được gửi. Ví dụ, nếu tôi gửi

XUẤT XỨ: http://example.com

Máy chủ kiểm tra xem miền này có nằm trong danh sách trắng hay không và nếu có, tiêu đề:

Access-Control-Allow-Origin: [url nhận được tại đây]

được gửi lại, cùng với phản hồi (Đây là trường hợp đơn giản, cũng có các yêu cầu được đấu trước, nhưng câu hỏi vẫn giống nhau).

Điều này có thực sự an toàn? Nếu ai đó muốn nhận thông tin, việc giả mạo tiêu đề GỐC có vẻ như là một nhiệm vụ thực sự tầm thường. Ngoài ra, tiêu chuẩn nói rằng chính sách được thực thi trong trình duyệt, chặn phản hồi nếu Access-Control-Allow-Origin không đúng. Rõ ràng là nếu bất kỳ ai đang cố lấy thông tin đó, họ sẽ không sử dụng trình duyệt tiêu chuẩn để chặn thông tin đó.


Đọc câu trả lời này là ai đó không rõ ràng về chính sách cùng nguồn gốc và CORS là gì và tại sao chúng tồn tại: stackoverflow.com/a/27294846/3340994
nishantbhardwaj2002 Ngày

Câu trả lời:


52

Bạn không thể giả mạo tiêu đề Nguồn gốc bằng JavaScript trong trình duyệt web. CORS được thiết kế để ngăn chặn điều đó.

Bên ngoài trình duyệt web, điều đó không quan trọng. Nó không được thiết kế để ngăn mọi người lấy dữ liệu có sẵn cho công chúng. Bạn không thể tiết lộ nó cho công chúng mà không có các thành viên của công chúng nhận được nó.

Nó được thiết kế để đưa ra:

  • Alice, một người cung cấp API được thiết kế để có thể truy cập qua Ajax
  • Bob, một người có trình duyệt web
  • Charlie, một bên thứ ba điều hành trang web của riêng họ

Nếu Bob truy cập trang web của Charlie, thì Charlie không thể gửi JS tới trình duyệt của Bob để nó lấy dữ liệu từ trang web của Alice và gửi cho Charlie.

Tình huống trên trở nên quan trọng hơn nếu Bob có tài khoản người dùng trên trang web của Alice, cho phép anh ta thực hiện những việc như đăng nhận xét, xóa dữ liệu hoặc xem dữ liệu không có sẵn cho công chúng - vì nếu không được bảo vệ, JS của Charlie có thể nói với trình duyệt của Bob để làm điều đó sau lưng Bob (và sau đó gửi kết quả cho Charlie).

Nếu bạn muốn ngăn những người không được phép xem dữ liệu, thì bạn cần bảo vệ dữ liệu đó bằng mật khẩu, chứng chỉ máy khách SSL hoặc một số phương thức xác thực / ủy quyền dựa trên danh tính khác.


1
Về cơ bản CORS hay Chia sẻ tài nguyên chéo và ủy quyền là hai việc riêng biệt. Như từ viết tắt cho thấy nó thực sự CHO PHÉP chia sẻ nguồn gốc chéo. Việc khách hàng CÓ THỰC SỰ được phép làm điều này hay không là do logic ủy quyền của bạn xác định.
reaper_unique

149

Mục đích là để ngăn chặn điều này -

  • Bạn vào trang web X
  • Tác giả của trang web X đã viết một tập lệnh độc ác được gửi đến trình duyệt của bạn
  • tập lệnh đang chạy trên trình duyệt của bạn đăng nhập vào trang web ngân hàng của bạn và thực hiện những điều xấu xa và vì nó đang chạy khi bạn trong trình duyệt của bạn nên nó có quyền làm như vậy.

Ý tưởng là trang web ngân hàng của bạn cần một số cách để cho trình duyệt của bạn biết liệu các tập lệnh trên trang web X có đáng tin cậy để truy cập các trang tại ngân hàng của bạn hay không.


9
Câu trả lời của bạn cũng rất rõ ràng, cảm ơn. Tôi không ủng hộ vì nó đòi hỏi 15 danh tiếng.
Gibarian2001,

Vì vậy, CORS không bảo vệ tính toàn vẹn của một ứng dụng trên trang web X mà nó đang bảo vệ tính toàn vẹn của NGÂN HÀNG, nói rằng web X đáng tin cậy để thực hiện các lệnh gọi API tới BANK?
luigi7up 17/12/14

7
@ luigi7up: Không, CORS không bảo vệ bất cứ thứ gì, trên thực tế nó "làm suy yếu" bảo mật bằng cách xác định ngoại lệ cho SOP. Các Access-Control-Allow-Originquy định cụ thể tiêu đề mà nguồn gốc (được quy định trong Origintiêu đề) được phép truy cập vào tài nguyên. Thông thường, chỉ những yêu cầu có cùng nguồn gốc mới được phép làm như vậy. Phần quan trọng nhất ở đây là: việc cho phép / từ chối được thực thi bởi BROWSER, không phải máy chủ. Điều này có nghĩa là chương trình Access-Control-Allow-Originbảo vệ trình duyệt của bạn, không phải tài nguyên trên máy chủ hoặc chính máy chủ.
daniel f.

Điều gì ngăn cản tác giả của trang web X đăng nhập bạn vào ngân hàng thông qua chương trình phụ trợ trang web của anh ta, sau đó sẽ được sử dụng làm proxy? Đó chỉ là một lớp bổ sung mà anh ấy sẽ phải tạo, nhưng nó sẽ hoàn toàn tránh được vấn đề CORS mà anh ấy sẽ gặp phải trong trình duyệt. theo một cách rất đơn giản ..
pootzko

1
@pootzko: trong trường hợp của bạn, trang web độc hại X sẽ không có phiên hợp lệ cho trang web ngân hàng. Ngay cả khi nạn nhân đã đăng nhập vào ngân hàng của anh ta (ví dụ: trong một tab khác), trang web độc hại X sẽ không có quyền truy cập vào phiên đó, do chính sách cookie được trình duyệt thực thi: trình duyệt sẽ không bao giờ gửi cookie phiên của ngân hàng đến trang web X.
daniel f.

64

Chỉ để thêm vào câu trả lời của @jcoder, toàn bộ điểm của Origintiêu đề không phải là để bảo vệ các tài nguyên được yêu cầu trên máy chủ. Nhiệm vụ đó phụ thuộc vào chính máy chủ thông qua các phương tiện khác chính xác vì kẻ tấn công thực sự có thể giả mạo tiêu đề này bằng các công cụ thích hợp.

Mục đích của Origintiêu đề là để bảo vệ người dùng. Tình huống như sau:

  • kẻ tấn công tạo ra một trang web độc hại M

  • một người dùng Alice bị lừa để kết nối với M, có chứa một tập lệnh cố gắng thực hiện một số hành động thông qua CORS trên máy chủ B thực sự hỗ trợ CORS

  • B có thể sẽ không có M trong Access-Control-Allow-Origintiêu đề của nó , nguyên nhân tại sao nó?

  • Điểm mấu chốt là M không có cách nào để giả mạo hoặc ghi đè Origintiêu đề, bởi vì các yêu cầu được khởi tạo bởi trình duyệt của Alice. Vì vậy, trình duyệt của cô ấy sẽ đặt (đúng) Originthành M, không nằm trong Access-Control-Allow-OriginB, do đó yêu cầu sẽ không thành công.

Alice có thể Origintự mình thay đổi tiêu đề, nhưng tại sao cô ấy lại làm vậy, vì điều đó có nghĩa là cô ấy đang tự làm hại chính mình?

TL; DR: OriginTiêu đề bảo vệ người dùng vô tội. Nó không bảo mật tài nguyên trên máy chủ. Kẻ tấn công có thể giả mạo nó trên máy của chính anh ta, nhưng không thể giả mạo trên máy không thuộc quyền kiểm soát của anh ta.

Máy chủ vẫn nên bảo vệ tài nguyên của mình, vì Origintiêu đề phù hợp không có nghĩa là quyền truy cập được cấp phép. Tuy nhiên, Origintiêu đề KHÔNG khớp có nghĩa là một truy cập trái phép.


11
Câu trả lời rất hay. IMHO tổng thể tốt nhất.
petersboards

Tại sao đây không phải là câu trả lời được chọn? Đây rõ ràng là tốt nhất. Điểm thứ tư được đề cập trong câu trả lời này là những gì người đăng thực sự yêu cầu.
alaboudi

câu trả lời hay nhất Daniel. Đây là toàn bộ điểm của CORS: "Điểm mấu chốt là M không có cách nào để giả mạo hoặc ghi đè tiêu đề Nguồn gốc, vì trình duyệt của ALICE bắt đầu các yêu cầu. Vì vậy, trình duyệt của cô ấy sẽ đặt Nguồn gốc (đúng) thành M, không nằm trong Access-Control-Allow-Origin of B, do đó yêu cầu sẽ không thành công. "
Lukas Lukac,

14

Mục đích của chính sách nguồn gốc không phải là để ngăn mọi người truy cập nội dung trang web nói chung; nếu ai đó muốn làm điều đó, họ thậm chí không cần trình duyệt. Vấn đề là dừng các tập lệnh máy khách truy cập nội dung trên miền khác mà không có quyền truy cập cần thiết. Xem mục nhập Wikipedia về Chính sách Nguồn gốc Giống nhau .


2
"Vấn đề là dừng các tập lệnh máy khách truy cập nội dung trên một miền khác", điều này đã được giải quyết bằng Chính sách Nguồn gốc Giống nhau. Không? Ý tôi là trang web của tôi gửi cho bạn một số JS và trình duyệt của bạn sẽ không cho phép các lệnh gọi ajax đến một số miền khác. đó là cùng một chính sách xuất xứ. CORS đang thực hiện rất hiệu quả - cho phép ajax của tôi truy cập vào miền khác. Tôi đang thiếu một cái gì đó rất lớn ở đây :)
luigi7up

to @ luigi7up: Vâng, CORS phản đối. Nó cho phép chủ sở hữu của một trang web cấp quyền truy cập vào các dịch vụ của mình từ nhiều miền đáng tin cậy.
SergeyT

6

Sau khi đọc về CORS, tôi không hiểu nó cải thiện bảo mật như thế nào.

CORS không cải thiện bảo mật. CORS cung cấp một cơ chế để máy chủ thông báo cho các trình duyệt biết cách chúng nên được các miền nước ngoài truy cập và nó cố gắng làm như vậy theo cách phù hợp với mô hình bảo mật của trình duyệt đã tồn tại trước CORS (cụ thể là Chính sách nguồn gốc giống nhau ).

Nhưng Chính sách Xuất xứ Giống nhau và CORS có một phạm vi hạn chế. Cụ thể, bản thân đặc tả CORS không có cơ chế từ chối yêu cầu. Nó có thể sử dụng tiêu đề để yêu cầu trình duyệt không cho phép một trang từ miền nước ngoài đọc phản hồi. Và, trong trường hợp yêu cầu trước khi bay, nó có thể yêu cầu trình duyệt không gửi cho nó một số yêu cầu nhất định từ miền nước ngoài. Nhưng CORS không chỉ định bất kỳ phương tiện nào để máy chủ từ chối (nghĩa là không thực thi) một yêu cầu thực tế.

Hãy lấy một ví dụ. Một người dùng đã đăng nhập vào trang web Athông qua cookie. Người dùng tải trang web độc hại M, trang này cố gắng gửi một biểu mẫu tương POSTứng với A. Chuyện gì sẽ xảy ra? Vâng, có hoặc không có CORS, và có hoặc không Mlà miền được phép, trình duyệt sẽ gửi yêu cầu đến Acùng với cookie ủy quyền của người dùng và máy chủ sẽ thực thi mã độc hại POSTnhư thể người dùng đã khởi tạo nó.

Cuộc tấn công này được gọi là Cross-Site Request Forgery và bản thân CORS không làm gì để giảm thiểu nó. Đó là lý do tại sao các biện pháp bảo vệ CSRF rất quan trọng nếu bạn cho phép người dùng yêu cầu thay đổi dữ liệu.

Bây giờ, việc sử dụng Origintiêu đề có thể là một phần quan trọng trong việc bảo vệ CSRF của bạn. Thật vậy, việc kiểm tra nó là một phần của khuyến nghị hiện tại về phòng thủ CSRF đa hướng . Nhưng việc sử dụng Origintiêu đề đó nằm ngoài thông số kỹ thuật CORS.

Tóm lại, CORS là một đặc tả hữu ích để mở rộng mô hình bảo mật Chính sách nguồn gốc hiện có cho các miền được chấp nhận khác. Nó không tăng cường bảo mật và các trang web cần các loại cơ chế bảo vệ giống như chúng đã làm trước CORS.


1

Tôi đã muộn để trả lời nhưng tôi không nghĩ rằng bất kỳ bài đăng nào ở đây thực sự cung cấp câu trả lời được tìm kiếm. Điều quan trọng nhất là trình duyệt là tác nhân đang ghi origingiá trị tiêu đề. Một tập lệnh ác không thể viết origingiá trị tiêu đề. Khi máy chủ phản hồi lại bằng một Access-Control-Allow-Origintiêu đề, trình duyệt sẽ cố gắng đảm bảo rằng tiêu đề này chứa origingiá trị được gửi trước đó. Nếu không, nó sẽ gây ra lỗi và không trả lại giá trị cho tập lệnh yêu cầu. Các câu trả lời khác cho câu hỏi này đưa ra một kịch bản tốt khi bạn muốn từ chối một câu trả lời cho kịch bản ác.

@daniel f cũng cung cấp một câu trả lời tốt cho câu hỏi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.