Tôi đã thực hiện một số nghiên cứu để trả lời câu hỏi của bạn và đây là kết quả.
Trước hết, chúng ta hãy nhìn vào phần này:
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="some_token" />
Phần này được tạo ra bằng phương pháp csrf_meta_tags. Từ mã nguồn chúng ta có thể thấy rằng:
"nội dung" giá trị thuộc tính của <meta name="csrf-param" />
được lấy từ request_forgery_protection_token, và, theo mặc định, là :authenticity_token
.
giá trị thuộc tính "nội dung" của <meta name="csrf-token" />
được lấy từ phương thức form_authenticity_token, trong đó mã thông báo được lấy từ phiên hoặc được tạo.
Bây giờ chúng ta hãy xem phần này:
<input type="hidden" name="authenticity_token" value="another_token" />
Từ nguồn chúng ta có thể thấy rằng:
- nhập ẩn này được trả về bởi extra_tags_for_form phương pháp.
- Bên trong
extra_tags_for_form
gọi phương thức token_tag.
token_tag
phương thức lấy mã thông báo làm đối số.
token
đối số cho token_tag
trước đây được trích xuất từ options
đối số của phương pháp form_tag trong phương thức html_options_for_form.
Vì vậy, nếu bạn không tự đặt authenticity_token
param trong options
để tùy chỉnh của bạn token và không đáp ứng các điều kiện dẫn đến việc thiết token
giá trị false (sẽ được đề cập dưới đây), token_tag
phương pháp sẽ nhận nil
và gọi phương thức form_authenticity_token tương tự được sử dụng để tạo thẻ <meta name="csrf-token" />
. Nhân tiện, để điền thuộc tính đầu vào name
, nó cũng sử dụng request_forgery_protection_token, được sử dụng khi phát sinh thẻ <meta name="csrf-param" />
.
Và bởi vì tất cả điều này xảy ra trong cùng một yêu cầu, hãy gọi phương thức form_authenticity_token
sẽ trả về cùng một kết quả trong cả hai trường hợp.
Thẻ nào trong hai thẻ được sử dụng khi gửi biểu mẫu?
Khi gửi biểu mẫu sẽ được sử dụng mã thông báo từ đầu vào bị ẩn.
Mã từ <meta />
cũng có thể được sử dụng, nhưng chỉ khi tất cả các bên dưới conditions (mà làm token
đối số của token_tag
phương pháp được thiết lập để false) sẽ được đáp ứng:
:remote => true
nên được thông qua trong options
của form_tag
.
embed_authenticity_token_in_remote_forms
cấu hình được đặt thành sai.
authenticity_token
không được chuyển vào options
.
Nhưng tại sao mã thông báo biểu mẫu khác với mã thông báo csrf?
Đối với câu hỏi này, có thể sự cố này xảy ra do bộ nhớ đệm. Hoặc, có thể, nếu bạn sử dụng đá quý Turbolinks, nó có thể gây ra vấn đề này (bạn có thể kiểm tra điều này nếu bạn hoàn toàn làm mới trang và so sánh mã thông báo một lần nữa). Để biết thêm thông tin về sự cố với Turbolinks, hãy kiểm tra this question.
Cảm ơn. Tôi sẽ cần một chút thời gian để nhìn vào câu trả lời và hiểu nó. – thebravoman
@thebravoman Có hữu ích không? –
Đó là, tôi chỉ cần kiểm tra một vài điều với ứng dụng của mình để cố gắng hiểu nó hoàn toàn – thebravoman