#Tìm hiểu về Authenticity Token trong Rails
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ừ 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
http://eren.0fees.net/2012/05/22/understand-rails-authenticity-token/