2013-10-24 14 views
6

Từ 2 ứng dụng khác nhau, tôi có thể gửi yêu cầu qua nhiều lần. Mặc dù trình duyệt trả về lỗi của Cross-Origin nhưng máy chủ của tôi vẫn đang nhận và thực thi yêu cầu. Ví dụ: từ một trang web từ xa, tôi có thể gọi yêu cầu tên miền chéo bằng cách sử dụng,Làm thế nào để ngừng các trang web khác gửi yêu cầu ajax miền chéo?

$.ajax({ 
     xhrFields: { 
      withCredentials: true 
     }, 
     data:{ my: 'a' }, 
     url: 'http://MyApp/Page', 
     type: 'POST' 
}) 

Tôi biết rằng trình duyệt không trả về phản hồi cho tập lệnh, nhưng trang máy chủ của tôi vẫn thực thi.

Giả sử người dùng vô tội đăng nhập một trang web, http://abc.com. Ứng dụng này sẽ chấp nhận yêu cầu đăng bài để chèn bản ghi. Khi người dùng vô tội truy cập vào số http://HackerSite.com vô tội, số http://HackerSite.com sẽ có thể gửi yêu cầu POST tới http://abc.com qua Ajax. Làm thế nào để tránh điều này?

+2

Câu hỏi hay. Nếu bạn có câu trả lời cho rằng tôi sẽ đánh giá cao rất nhiều nếu bạn đăng nếu. –

+0

Đối với dịch vụ WCF, bạn có thể đặt ** crossdomainscriptaccessenabled ** thành false trong cấu hình điểm cuối của bạn. – Saranya

+2

Bạn sẽ có cùng một vấn đề với việc gửi biểu mẫu, không tham gia javascript. Thông số CORS không được tạo ra với sự bảo mật bổ sung. Thay vào đó, nó cho phép bạn về cơ bản thực hiện các hành động tương tự mà bạn đã có thể thực hiện (cross-origin) sans ajax. Thông số CORS đi xa hơn một chút, trong đó nó đảm bảo máy chủ của bạn thậm chí không nhận được yêu cầu cơ bản, nếu máy chủ của bạn không chọn tham số chính xác và yêu cầu tương tự không thể được gửi đi qua nguồn gốc ajax (nói, thông qua gửi biểu mẫu). Khái niệm cuối cùng này được gọi là preflighting. –

Trả lời

2

Lỗ hổng mà bạn đang nói đến là CSRF nhưng có thể được bảo vệ.

Bạn có thể bảo vệ chống POST được gửi bên ngoài yêu cầu AJAX (ví dụ: bằng biểu mẫu HTML) bằng cách gửi và kiểm tra tiêu đề X-Requested-With: XMLHttpRequest. Điều này cũng không thể được gửi qua tên miền chéo thông qua AJAX do tiêu đề này không nằm trong danh sách an toàn (không có CORS).

Tuy nhiên, trước đây đã có một số thao tác thông qua các plugin như đèn flash có thể đặt tiêu đề không thể qua trình duyệt (ví dụ: Referer) để bảo vệ chống lại điều này, hãy sử dụng số synchroniser token pattern. mã thông báo trong trường ẩn sẽ được xác thực cũng như cookie cho tất cả các yêu cầu phá hoại. Bằng cách phá hoại, tôi có nghĩa là các yêu cầu thay đổi, gửi hoặc xóa mọi thứ (tức là những gì nên là BÀI ĐĂNG).

Để biết thêm thông tin, hãy xem tại đây: http://www.html5rocks.com/en/tutorials/cors/

+0

Trong asp của tôi.trường hợp dạng web net, nó gửi cookie, Dưới đây là các quy tắc của preflight, 'Trình duyệt có thể bỏ qua yêu cầu preflight nếu các điều kiện sau là đúng: Phương thức yêu cầu là GET, HEAD hoặc POST và Ứng dụng không không đặt bất kỳ tiêu đề yêu cầu nào khác ngoài Accept, Accept-Language, Content-Language, Content-Type hoặc Last-Event-ID và Tiêu đề Loại nội dung (nếu được đặt) là một trong các tùy chọn sau: application/x- www-form-urlencoded multipart/form-data văn bản/đồng bằng ' – user960567

+0

Nhưng tôi sẽ kiểm tra lại và bạn biết đấy. Cảm ơn – user960567

+0

Tôi nghĩ bạn nói đúng - tôi sẽ chỉnh sửa. – SilverlightFox

0

Tiêu đề Access-Control-Allow-Origin phải được đặt thích hợp để không cho phép các miền khác với tên miền bạn yêu cầu. tuy nhiên điều này chỉ hoạt động cho các trình duyệt hiện đại. tham khảo http://encosia.com/using-cors-to-access-asp-net-services-across-domains/ http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity

+0

Đây không phải là nơi thích hợp để thực hiện bảo mật. Trình duyệt/ứng dụng khách không thể tin cậy được. –

1

Giải pháp dễ dàng nhưng không hoàn toàn chống đạn được gọi là "mã thông báo xác thực". Mỗi bài đăng đến từ trang web của bạn phải có Mã thông báo CSRF mà bạn xác thực ở phía máy chủ để đảm bảo yêu cầu thực sự đến từ trang web của bạn. Kiểm tra thông tin này để biết thêm thông tin: http://shiflett.org/articles/cross-site-request-forgeries

Các vấn đề liên quan