Skip to content

Instantly share code, notes, and snippets.

@kienbt01359
Last active December 25, 2015 11:29
Show Gist options
  • Save kienbt01359/6969594 to your computer and use it in GitHub Desktop.
Save kienbt01359/6969594 to your computer and use it in GitHub Desktop.

#Tìm hiểu về Authenticity Token trong Rails

Chuyện gì đã xảy ra?

Khi người dùng xem một form để tạo mới, cập nhật hay xóa một resource, ứng dụng Rails sẽ tạo một authenticity_token ngẫu nhiên, chứa cái authenticity_token này ở trong session, và đặt nó ở trong một hidden_field ở trong form.

<input name="authenticity_token" type="hidden" value="k9u7POignyF9RZiHT+C5kCwSoPPemDbAxd5va2CN4gY=">

Khi người dùng submit form, rails sẽ tìm kiếm authenticity_token, so sánh nó với cái mà được chứa trong session, và nếu chúng giống nhau thì request sẽ được cho phép tiếp tục. Xem thêm tại đây

Tại sao chuyện này xảy ra?

Từ authenticity_token được lưu trong session, client không thể biết được giá trị của nó. Điều này ngăn chặn việc subbmit form tới ứng dụng rails mà không thông qua form của ứng dụng. Tưởng tượng rằng bạn đang sử dụng service A, bạn đã đăng nhập vào service đó và mọi thứ đều rất ổn.
Bây giờ tưởng tượng rằng bạn đã sử dụng service B, và bạn đã thấy 1 ảnh bạn thích và và bấm vào để xem kích cỡ lớn hơn. Bây giờ, nếu có một vài mã ở trong Service B, nó có thể sẽ gửi tới Service A ( với Service mà bạn vừa đăng nhập), và hỏi để xóa account của bạn bằng cách gửi một request tới link http://serviceA.com/close_account điều này gọi là CSRF(Cross Site Request Forgery) - Xem thêm tại đây<br/
Nếu Service A có sử dụng authenticity token, hướng tấn công này sẽ không còn được áp dụng. Từ đó những request từ Service B sẽ không thể có một authenticity token đúng và ngăn chặn việc tấn công đó.

Chú ý:
Nhớ rằng Rails chỉ check authenticity_token đối với các phương thức request POST, PUT, và DELETE. Phương thức GET sẽ không bị kiểm tra authenticity token.
Tại sao có điều đó? Bởi vì đặc điểm của HTTP là GET request không tạo mới, chỉnh sửa, hoặc xóa resources của server và request nên là idempotent (nếu bạn chạy cùng một câu lệnh nhiều lần bạn có thể lấy cùng một kết quả trả về cho mỗi lần).

Bài tập: Sử dụng authenticity_token để bảo vệ request POST, PUT và DELETE. Đồng thời chắc chắn rằng khi tạo bao nhiêu GET request thì cũng không làm thể chỉnh sửa resource phía server

Tham khảo

http://eren.0fees.net/2012/05/22/understand-rails-authenticity-token/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment