9

Tôi hiểu rằng Rails theo mặc định không có bảo vệ CSRF cho các yêu cầu HTTP GET, bởi vì, nó tuyên bố chúng là không đáng tin cậy. Tuy nhiên, có thông tin nhạy cảm được trả lại cho người dùng từ các yêu cầu GET này và tôi sẽ không muốn trang web độc hại truy xuất thông tin này.Bảo vệ CSRF với các yêu cầu HTTP GET trong Rails

Cách tốt nhất để bảo vệ yêu cầu HTTP GET từ CSRF trong Rails là gì?

+1

Khi một bên độc hại thực hiện cuộc tấn công csrf họ không thấy kết quả của yêu cầu - chỉ các tác dụng phụ là nguy hiểm –

+0

Bạn thường sử dụng xác thực thông qua cookie cho loại nhiệm vụ này –

+0

@NikitaBeloglazov Ngay cả khi xác thực thông qua cookie , trình duyệt thường gửi cookie đến trang web nạn nhân khi thấy yêu cầu trang web của nạn nhân được thực hiện. Đây là từ [bài viết trên Wikipedia] (http://en.wikipedia.org/wiki/Cross-site_request_forgery#Example_and_characteristics): "Nếu ngân hàng của Bob giữ thông tin xác thực trong cookie và nếu cookie chưa hết hạn, sau đó trình duyệt của Bob tải hình ảnh sẽ gửi biểu mẫu rút tiền bằng cookie của mình, do đó cho phép giao dịch mà không có sự chấp thuận của Bob. " –

Trả lời

9

Để có thể đọc câu trả lời cho yêu cầu của một cuộc tấn công CSRF, kẻ tấn công sẽ cần phải khiến nạn nhân thực thi mã JavaScript của mình. Và trong trường hợp đó, quyền truy cập sẽ bị hạn chế bởi một số Same Origin Policy.

Giả sử yêu cầu tấn công thực sự là cross origin, các Same Origin Policy for DOM cấm truy cập thông qua DOM (ví dụ như khi nhúng sử dụng iframe) và Cross-Origin Resource Sharing (CORS) quy định yêu cầu cross-nguồn gốc qua XMLHttpRequest như sau:

Nếu yêu cầu là một simple cross-origin request, i . e. simple method chỉ với simple header fields, khi đó yêu cầu đó sẽ được gửi (điều này tương tự như CSRF dựa trên HTML). Nhưng việc truy cập phản hồi của một yêu cầu có nguồn gốc đơn giản phụ thuộc vào việc response allows resource sharing.

Yêu cầu nguồn gốc khác yêu cầu gọi là preflight trước khi yêu cầu thực tế được gửi. Yêu cầu đó được gửi để kiểm tra xem máy chủ có cho phép các yêu cầu từ nguồn gốc mà preflight được gửi đi hay không. Và chỉ khi preflight thành công và phản hồi cho yêu cầu thực sự cho phép chia sẻ tài nguyên, phản hồi có thể được truy cập.

Vì vậy, để kết luận: Trừ khi máy chủ của bạn hỗ trợ CORS và rõ ràng cho phép chia sẻ với bất kỳ nguồn gốc nào khác (i. E. Access-Control-Allow-Origin: *), phản hồi CSRF - nếu yêu cầu được cho phép - sẽ không thể đọc được bởi trang web tấn công .

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