Điểm của tiêu đề X-Requested-With là gì?


224

JQuery và các khung công tác khác thêm tiêu đề sau:

X-Requested With: XMLHttpRequest

Tại sao điều này là cần thiết? Tại sao một máy chủ muốn xử lý các yêu cầu AJAX khác với các yêu cầu thông thường?

CẬP NHẬT : Tôi vừa tìm thấy một ví dụ thực tế sử dụng tiêu đề này: https://core.spreedly.com/manual/payment-methods/adding-with-js . Nếu bộ xử lý thanh toán được yêu cầu mà không có AJAX, nó sẽ chuyển hướng trở lại trang web ban đầu khi hoàn tất. Khi được yêu cầu với AJAX, không có chuyển hướng nào được thực hiện.


7
"[Khi] được yêu cầu mà không có AJAX, nó sẽ chuyển hướng trở lại trang web ban đầu khi hoàn thành. Khi được yêu cầu với AJAX, không có chuyển hướng nào được thực hiện." -> Đó chính xác là lý do tại sao bạn muốn làm điều đó. :)
Robert Christian

Câu trả lời:


257

Một lý do chính đáng là bảo mật - điều này có thể ngăn chặn các cuộc tấn công CSRF vì tiêu đề này có thể được thêm vào miền chéo yêu cầu AJAX mà không có sự đồng ý của máy chủ thông qua CORS .

Chỉ các tiêu đề sau được phép có tên miền chéo:

  • Chấp nhận
  • Ngôn ngữ chấp nhận
  • Nội dung ngôn ngữ
  • ID sự kiện cuối
  • Loại nội dung

bất kỳ điều gì khác gây ra yêu cầu "trước chuyến bay" được đưa ra trong các trình duyệt được hỗ trợ CORS.

Không có CORS thì không thể thêm X-Requested-With vào yêu cầu XHR tên miền chéo.

Nếu máy chủ đang kiểm tra xem tiêu đề này có mặt hay không, thì nó biết rằng yêu cầu đã không bắt đầu từ miền của kẻ tấn công đang cố gắng thực hiện một yêu cầu thay mặt cho người dùng bằng JavaScript. Điều này cũng kiểm tra rằng yêu cầu không được gửi từ một dạng HTML thông thường, trong đó khó xác minh hơn rằng đó không phải là tên miền chéo mà không sử dụng mã thông báo. (Tuy nhiên, kiểm tra Origintiêu đề có thể là một tùy chọn trong các trình duyệt được hỗ trợ, mặc dù bạn sẽ để các trình duyệt cũ dễ bị tổn thương .)

Phát hiện bỏ qua Flash mới

Bạn có thể muốn kết hợp điều này với mã thông báo , vì Flash chạy trên Safari trên OSX có thể đặt tiêu đề này nếu có bước chuyển hướng . Có vẻ như nó cũng hoạt động trên Chrome , nhưng hiện đã được khắc phục. Thêm chi tiết tại đây bao gồm các phiên bản khác nhau bị ảnh hưởng.

OWASP Đề nghị kết hợp điều này với kiểm tra Xuất xứ và Người giới thiệu :

Kỹ thuật phòng thủ này được thảo luận cụ thể trong phần 4.3 của Phòng thủ chắc chắn cho việc giả mạo yêu cầu xuyên địa điểm. Tuy nhiên, việc bỏ qua biện pháp phòng vệ này bằng Flash đã được ghi nhận vào đầu năm 2008 và một lần nữa vào năm 2015 bởi Mathias Karlsson để khai thác lỗ hổng CSRF trong Vimeo. Nhưng, chúng tôi tin rằng cuộc tấn công Flash không thể giả mạo tiêu đề Xuất xứ hoặc Người giới thiệu vì vậy bằng cách kiểm tra cả hai, chúng tôi tin rằng sự kết hợp kiểm tra này sẽ ngăn chặn các cuộc tấn công CSRF của Flash. (LƯU Ý: Nếu bất cứ ai có thể xác nhận hoặc bác bỏ niềm tin này, vui lòng cho chúng tôi biết để chúng tôi có thể cập nhật bài viết này)

Tuy nhiên, vì những lý do đã được thảo luận, việc kiểm tra Origin có thể khó khăn.

Cập nhật

Đã viết một bài viết chuyên sâu hơn trên blog về CORS, CSRF và X-Requested-With tại đây .


14
Tôi không hiểu Điều gì ngăn kẻ tấn công xây dựng một yêu cầu và thêm X-Requested-Withtiêu đề?
Greg

13
@Greg: Trình duyệt - nó sẽ không cho phép tên miền chéo.
SilverlightFox

2
Ồ, tôi đã không nhận ra rằng sẽ không cần cấu hình CORS miễn là bạn ở trên cùng một tên miền. Đó là điều hiển nhiên khi bạn nghĩ về nó. Cảm ơn !
Greg

10
@ vol7ron: Không có gì ngăn cản họ, nhưng sau đó họ sẽ không có cookie của nạn nhân trong yêu cầu đánh bại đối tượng họ đưa ra yêu cầu. Để CSRF thành công, kẻ tấn công sẽ cần trình duyệt tự động đính kèm cookie với yêu cầu, vì vậy nếu không có trình duyệt thì không có cuộc tấn công CSRF.
SilverlightFox

3
@ vol7ron: Trước đây. CSRF là một vấn đề phó nhầm lẫn . Trình duyệt là phó giám đốc bối rối và bị "lừa" gửi cookie cho một yêu cầu mà người dùng không tự thực hiện.
SilverlightFox

25

Hãy chắc chắn rằng bạn đã đọc câu trả lời của SilverlightFox. Nó nhấn mạnh một lý do quan trọng hơn.

Lý do chủ yếu là nếu bạn biết nguồn của yêu cầu, bạn có thể muốn tùy chỉnh nó một chút.

Ví dụ, giả sử bạn có một trang web có nhiều công thức nấu ăn. Và bạn sử dụng một khung jQuery tùy chỉnh để trượt các công thức nấu ăn vào một thùng chứa dựa trên một liên kết mà họ nhấp vào. Liên kết có thể làwww.example.com/recipe/apple_pie

Bây giờ thông thường sẽ trả về một trang đầy đủ, tiêu đề, chân trang, nội dung công thức và quảng cáo. Nhưng nếu ai đó đang duyệt trang web của bạn, một số phần đó đã được tải. Vì vậy, bạn có thể sử dụng AJAX để nhận công thức mà người dùng đã chọn nhưng để tiết kiệm thời gian và băng thông, đừng tải tiêu đề / chân trang / quảng cáo.

Bây giờ bạn chỉ có thể viết một điểm cuối thứ cấp cho dữ liệu như thế www.example.com/recipe_only/apple_pienhưng khó duy trì và chia sẻ với người khác.

Nhưng nó dễ dàng hơn để phát hiện ra rằng đó là một yêu cầu ajax thực hiện yêu cầu và sau đó chỉ trả lại một phần dữ liệu. Bằng cách đó, người dùng sẽ lãng phí ít băng thông hơn và trang web có vẻ nhạy hơn.

Các khung công tác chỉ cần thêm tiêu đề vì một số có thể thấy hữu ích để theo dõi những yêu cầu nào là ajax và không. Nhưng nó hoàn toàn phụ thuộc vào nhà phát triển để sử dụng các kỹ thuật như vậy.

Nó thực sự giống với Accept-Languagetiêu đề. Một trình duyệt có thể yêu cầu một trang web vui lòng cho tôi xem phiên bản tiếng Nga của trang web này mà không phải chèn / ru / hoặc tương tự trong URL.


30
Wow, nghe có vẻ như một cơn ác mộng bảo trì khủng khiếp. Nếu bạn muốn trả về một đại diện khác của cùng một trang, bạn nên cung cấp một loại nội dung khác cho Accepttiêu đề. Sử dụng một tiêu đề tùy chỉnh cho âm thanh này có vẻ như sai cách để đi.
Gili

10

Một số khung công tác đang sử dụng tiêu đề này để phát hiện các yêu cầu xhr, ví dụ bảo mật lò xo đang sử dụng tiêu đề này để xác định yêu cầu xhr và đưa ra phản hồi json hoặc phản hồi html làm phản hồi.

Hầu hết các thư viện Ajax (Prototype, JQuery và Dojo kể từ phiên bản 2.1) bao gồm một tiêu đề X-Requested-With chỉ ra rằng yêu cầu được tạo bởi XMLHttpRequest thay vì được kích hoạt bằng cách nhấp vào nút siêu liên kết hoặc biểu mẫu gửi thông thường.

Nguồn: http://grails-plugins.github.io/grails-spring-security-core/guide/helperC Cầu.html

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.