Trên CSRF
Trước tiên, người ta phải nêu rõ CSRF là gì.
Cross site request forgery là một loại khai thác độc hại của trang web theo đó các lệnh trái phép được truyền từ người dùng mà trang web tin tưởng.
Hãy xem ví dụ sau: Tin tặc biết rằng bạn có tài khoản trên www.example.com và giả sử đó là trang web bạn đã đăng nhập và vẫn chạy phiên hợp lệ. Giờ đây, tin tặc có thể lôi kéo bạn mở một trang web khác, nói rằng trustme.com, mà trên đó anh ấy đã đăng một hình ảnh có mã sau:
<img src="http://www.example.com/users/delete"/>
Nếu lập trình viên của www.example.com thực sự có thể xóa tài khoản của bạn thông qua URL đó với yêu cầu GET đơn giản và tin tặc biết rằng, chỉ cần xem và tải hình ảnh đó bằng cookie hợp lệ của bạn sẽ xóa tài khoản của bạn trên example.com, mặc dù bạn chỉ lướt trustme.com và có vẻ như cả hai các trang web không liên quan gì đến nhau.
Để tóm tắt ví dụ này, CSRF khai thác sự tin tưởng rằng trang web có trong trình duyệt của người dùng, trong trường hợp này sự tin tưởng mà www.example.com có trong trình duyệt của bạn.
Để sử dụng tính tương tự cho trường hợp của bạn có nghĩa là khai thác sự tin tưởng của trang web trong trình duyệt của người dùng - nhưng niềm tin đó chưa được thiết lập, bởi vì người dùng chưa đăng nhập khi thấy biểu mẫu của bạn. Bạn phải đảm bảo rằng người dùng được chuyển hướng khi đã đăng nhập và cố gắng tải lại trang với biểu mẫu đó, bởi vì nếu không thì có thể khai thác được sự tin tưởng. Vì vậy, theo quy tắc chung, bất cứ khi nào bạn sử dụng cookie và phiên để yêu cầu xác thực người dùng, tức là để xác nhận hoặc thiết lập niềm tin vào người dùng, hãy sử dụng tính năng bảo vệ CSRF. Vì bạn muốn thiết lập niềm tin vào người dùng của mình khi đăng ký, điều tương tự cũng áp dụng.
Thật không may, các cuộc tấn công CSRF không chỉ giới hạn ở đó. Tôi phát hiện ra hai điều khác có thể xảy ra (và chắc chắn không giới hạn ở đó):
1.: Sau đây là một ví dụ tiện lợi của gián điệp trên tài khoản của bạn, có thể thực hiện bằng cách bỏ qua bảo vệ CSRF về hình thức đăng nhập:
- Các hacker tạo một tài khoản trên một trang web bạn thực sự tin tưởng (youtrustthis.com)
- Ông rèn yêu cầu đăng nhập từ trình duyệt của bạn bằng thông tin đăng nhập của chính bạn và sử dụng tài khoản của mình
- Nếu bạn không nhận thấy rằng bạn đang thực sự truy cập youtrustthis.com với tư cách là một người dùng khác, sau đó kẻ tấn công sẽ xem bạn đã làm gì ", điều này sẽ làm gián điệp bạn nhiều hơn
2: Nếu không có bảo vệ CSRF, hacker có thể bắt chước đăng nhập của bạn hoặc đăng ký biểu mẫu trong tài liệu html của riêng mình và thuận tiện gửi nó một lần nữa (hoặc chỉ cần thực hiện bằng cách sử dụng curl từ thiết bị đầu cuối) mà không nhận thấy rằng yêu cầu không thực sự đến từ chính nó - tức là, biểu mẫu đăng nhập thực tế trên miền đáng tin cậy không bao giờ được hiển thị trong trình duyệt của bạn và không được gửi từ đó. Điều này cho phép anh ta thực hiện các cuộc tấn công brute force dễ dàng hơn nhiều. Nếu người dùng độc hại thành công trong việc cố gắng tìm ra thông tin đăng nhập, máy chủ của bạn sẽ phản hồi bằng cookie phiên hợp lệ và tin tưởng người dùng đó, theo đó anh ta lấy cắp danh tính của bạn. Nếu nó là một hình thức đăng ký, anh ta sẽ có thể đăng ký một lượng lớn tài khoản và do đó spam cơ sở dữ liệu của bạn.
Để tóm tắt điều này: Đi với bảo vệ CSRF. Người dùng độc hại có thể sử dụng rất nhiều thông tin đăng nhập không an toàn và đăng ký biểu mẫu để lạm dụng trang web của bạn và theo dõi người dùng của bạn hoặc lấy cắp danh tính của họ.
Để biết thêm thông tin, hãy tham khảo this similar question (for login forms) và this academic paper. Sau này có một chương dành riêng về CSRF đăng nhập trên trang 3. Ngoài ra, hãy xem CSRF prevention cheat sheet này.
On cách giải quyết tiềm năng
Kể từ bảo vệ CSRF sử dụng phiên để so sánh dấu hiệu tạo ra trên server-side với một trong đó đã được gửi từ một hình thức, tôi không thể nghĩ ra một cách để làm điều duy nhất phía khách hàng này, tức là mà không cần nhấn Rails stack. Toàn bộ vấn đề là khách hàng chỉ nhận được mã thông báo sau khi nó được tạo phía máy chủ.
bản sao có thể có của [Biểu mẫu đăng nhập có cần mã thông báo chống lại các cuộc tấn công CSRF không?] (Http://stackoverflow.com/questions/6412813/do-login-forms-need-tokens-against-csrf-attacks) – thomasrutter
* Sigh * Nó không phải là một bản sao. Vui lòng đọc câu hỏi khác, đó là về biểu mẫu đăng nhập. Đây là về giai đoạn đăng ký. –
Lưu ý rằng nếu biểu mẫu đăng ký của bạn tự động đăng nhập bạn sau khi được gửi, nó dễ bị tấn công bởi cùng một lớp tấn công CSRF như trang đăng nhập http://stackoverflow.com/questions/6412813/do-login- forms-need-tokens-against-csrf-attacks –