2012-04-20 14 views
11

Tôi đã nghe về CSRF một thời gian dài trước đây, và điều tôi nghe hầu hết thời gian là:Bảo vệ CSRF thực sự là gì?

Bảo vệ chống lại các cuộc tấn công CSRF là quan trọng để ai đó không nộp mẫu đơn của bạn tự động (sử dụng bot hoặc một cái gì đó)

Vâng, điều đó không đúng 100% đúng không?

Tôi đã thực hiện tìm kiếm web trong khoảng 3 năm và rất đơn giản để thực hiện yêu cầu, phân tích trường csrftokenmiddleware và BẬT nó cùng với các trường khác.

Vì vậy, nó thực sự là gì?

+0

@agf Tôi chỉ đọc câu hỏi đó và tôi không thấy bản sao ': (' –

+0

Chắc chắn. Tôi đang đọc câu trả lời ngay bây giờ ...;) –

+2

Bạn mô tả bài đăng" ẩn danh ". Đó là tất cả về bảo vệ bài đăng đó xảy ra với thông tin xác thực của người dùng đã đăng nhập thực sự. – Cheekysoft

Trả lời

8

Có, bạn có thể xóa biểu mẫu và nhận mã thông báo ngăn chặn CSRF. Nhưng bạn không thể gửi biểu mẫu mà không cần cạo trang web và bạn không thể nhận mã thông báo từ người khác và sau đó gửi biểu mẫu - nó được liên kết với một phiên. Đó là những gì bảo vệ CSRF thực sự ngăn chặn, ai đó lừa người dùng gửi biểu mẫu.


Một mô tả tổng quát hơn của CSRFs Nguyên văn để đáp ứng với Django's comments framework and CSRF:

Một CSRF là một cuộc tấn công mà một người nào đó mà không được phép truy cập vào một thủ thuật tài nguyên một người không được phép vào truy cập vào nó.

Vì vậy, ví dụ: bảo vệ CSRF có thể ngăn người khác lừa người dùng đăng nhận xét có liên kết spam hoặc phần mềm độc hại trong đó. Ngoài ra, yêu cầu họ lừa người dùng đưa ra có thể không đúng định dạng, được thực hiện để làm hỏng máy chủ web của bạn hoặc bao gồm mã có nghĩa là trượt qua quy trình xác thực và gây thiệt hại cho cơ sở dữ liệu của bạn hoặc xâm phạm trang web của bạn theo các cách khác.

Vì vậy, nếu không có sự bảo vệ của CSRF, ai đó về mặt lý thuyết có thể lừa người dùng đã đăng nhập để gửi nhận xét họ đã không thực sự viết.

Với bảo vệ CSRF, Django sẽ phát hiện rằng đó không phải là dữ liệu thực được gửi qua biểu mẫu thực tế trên trang web của bạn và sẽ từ chối nó.

1

Đó là sự bảo vệ cho loại kịch bản khác. Đôi khi kẻ tấn công có thể tiêm javascript, hoặc iframe hoặc img src-s vào trang của bạn, ở nơi mà bất kỳ người dùng đã đăng nhập nào cũng có thể truy cập. Khi người dùng truy cập trang (giả sử trang có nhận xét và một nhận xét yêu cầu liên kết đăng bài của người tấn công), yêu cầu đó được thực hiện bởi trình duyệt của người dùng đã đăng nhập, hoàn toàn với cookie của anh ấy. CSRF về cơ bản bảo vệ các loại trình kích hoạt được kích hoạt này (các đệ trình phía máy khách đơn giản). Tất nhiên, bất kỳ kẻ tấn công nào cũng có thể yêu cầu trang, phân tích cú pháp cho mã thông báo và tạo yêu cầu bằng mã thông báo nhưng không thể thực hiện việc này bên cạnh người dùng đã đăng nhập.

16

Hãy tưởng tượng một ứng dụng web ngân hàng điện tử tại banking.example.com với các hình thức sau đây để nộp giao dịch:

<form action="/transaction" method="post"> 
    <input type="text" name="beneficiary"/> 
    <input type="text" name="amount"/> 
    <input type="submit" value="Pay"/> 
</form> 

Kẻ tấn công bây giờ có thể thiết lập một trang web tại hacker.net như sau:

<form action="https://banking.example.com/transaction" method="post" style="visibility:hidden"> 
    <input type="text" name="beneficiary" value="John Doe, Account No. 34-236326-1"/> 
    <input type="text" name="amount" value="1000000"/> 
    <input type="submit" value="Pay"/> 
</form> 
<script> 
    document.forms[0].submit(); 
</script> 

Kẻ tấn công sau đó sẽ lừa nạn nhân truy cập hacker.net, điều này sẽ khiến cho các trình duyệt của nạn nhân gửi yêu cầu POST tới ứng dụng ngân hàng điện tử, tạo ra một giao dịch lớn cho hacker. Điều này làm việc vì trình duyệt của nạn nhân vui vẻ gửi cookie phiên cùng với yêu cầu POST giả mạo cho ứng dụng ngân hàng điện tử. Nếu biểu mẫu đã được bảo vệ bởi một mã thông báo CSRF, thì kẻ tấn công không thể khiến trình duyệt của nạn nhân gửi yêu cầu POST hợp lệ và do đó cuộc tấn công sẽ không thể thực hiện được.

Loại tấn công này được gọi là tấn công yêu cầu qua trang web chéo (CSRF).

Chắc chắn, các cuộc tấn công CSRF cũng là lý do khiến mọi người đưa ra lời khuyên về việc không bao giờ truy cập các trang web khác trong khi đăng nhập vào một ngân hàng điện tử hoặc ứng dụng web quan trọng khác.

Mã thông báo CSRF không bảo vệ biểu mẫu web được tự động gửi bởi người dùng được ủy quyền thông thường. Để bảo vệ điều đó, bạn sẽ sử dụng một số CAPTCHA.

+0

Bạn nghĩ điều này khác với việc xác thực liên kết giới thiệu ở phía máy chủ như thế nào? Không hỗ trợ cookie csrf nhưng chỉ thực hiện xác nhận này, tôi vẫn có thể xác định được cuộc tấn công. – Ethan

+0

Ok, tôi đã tìm hiểu lý do tại sao liên kết giới thiệu không được sử dụng. Nó bị chặn trong nhiều trường hợp vì nó được coi là giữ thông tin nhạy cảm đôi khi. Các công ty và các proxy của họ thường làm điều đó. Tuy nhiên, nếu HTTPS được sử dụng, thì có nhiều khả năng nó sẽ không bị chặn. Và, cũng có đề cập rằng liên kết giới thiệu có thể bị giả mạo. – Ethan

+0

Tôi gặp lại câu hỏi này trong khi đưa cho bạn bè về CORS. 'document.forms [0] .submit();' sẽ không hoạt động vì chính sách cùng nguồn gốc, đúng không? –

0

Bạn sẽ không thể

để thực hiện một yêu cầu, phân tích lĩnh vực csrftokenmiddleware và gửi nó cùng với các lĩnh vực khác.

vì JS trên miền khác sẽ không thể tìm nạp và sử dụng dữ liệu từ miền của bạn để tạo yêu cầu nếu máy chủ của bạn được định cấu hình properly.

Đọc khoảng CORS.