2016-08-10 24 views
8

On cùng một trang của một đường ray 4 ứng dụng Tôi có mộtRails authenticity_token trên một hình thức vs CSRF thẻ

vào đầu:

<meta name="csrf-param" content="authenticity_token" /> 
<meta name="csrf-token" content="some_token" /> 

và dưới trong cơ thể:

<form action="/someaction" method="post"> 
<input name="utf8" type="hidden" value="&#x2713;" /> 
<input type="hidden" name="_method" value="patch" /> 
<input type="hidden" name="authenticity_token" value="another_token" /> 

Mã thông báo csrf cần cho cuộc gọi js. Nhưng tại sao mã thông báo biểu mẫu khác với mã thông báo csrf? Thẻ nào trong hai thẻ được sử dụng để gửi biểu mẫu?

Trả lời

0

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:

  1. "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.

  2. 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:

  1. nhập ẩn này được trả về bởi extra_tags_for_form phương pháp.
  2. Bên trong extra_tags_for_form gọi phương thức token_tag.
  3. token_tag phương thức lấy mã thông báo làm đối số.
  4. 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:

  1. :remote => true nên được thông qua trong options của form_tag .
  2. embed_authenticity_token_in_remote_forms cấu hình được đặt thành sai.
  3. 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.

+0

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

+0

@thebravoman Có hữu ích không? –

+0

Đó 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

Các vấn đề liên quan