2016-04-25 18 views
6

Tôi đang cố gắng để có được bộ nhớ đệm trang đầy đủ trong Rails nhưng tôi đã đánh một lớn của một snag liên quan đến CSRF - hoặc có lẽ chỉ là sự hiểu biết của tôi về nó. Tôi hiện đang có chuỗi form_authenticity_token được lưu trữ trong cookie mà JS có thể truy cập và viết lại các thẻ tiêu đề.Mã thông báo xác thực Rails 4 - cả đầu vào và đầu vào bị ẩn biểu mẫu?

Có hai nơi tôi tìm thẻ trong HTML được tạo của tôi:

1) Trong đầu

<meta name="csrf-token" content="[hash]">

2) Bên trong yếu tố đầu vào ẩn của một hình thức

<input type="hidden" name="authenticity_token" value="[different hash]">

Như đã chỉ ra, các băm này khác nhau (ở chế độ phát triển nơi bộ nhớ đệm không phải là enabl ed). Tại sao chúng khác nhau? Tại sao tôi có thể xóa các thẻ meta đầu và để nguyên dạng đầu vào một mình và yêu cầu được cho phép? Tuy nhiên, khi tôi xóa thẻ đầu vào biểu mẫu và để lại tiêu đề, yêu cầu bị từ chối?

Có hiệu quả điều này có nghĩa là thẻ đầu là vô dụng, phải không? Tôi có thể viết lại thẻ đầu vào biểu mẫu cho giá trị trong cookie của mình giống như tôi đã làm với thẻ tiêu đề, nhưng vì chúng khác nhau, tôi thận trọng với kết quả cuối cùng có ý nghĩa gì khi nói đến bộ nhớ đệm toàn bộ trang .

ứng dụng điều khiển bao gồm:

protect_from_forgery with: :exception 
before_filter :csrf_cookie 

def csrf_cookie 
    cookies['authenticity-token'.freeze] = { 
    value: form_authenticity_token, 
    expires: 1.day.from_now, 
    secure: (Rails.env.staging? || Rails.env.production?) 
    } 
end 

Trả lời

2

Duyệt SO về một vấn đề khác led me to the answer. Tóm lại, Rails giúp người dùng jQuery bằng cách chèn mã thông báo CSRF vào các yêu cầu ajax tự động. Nó tìm kiếm nó trong các thẻ meta.

Vì vậy, có mã thông báo CSRF bên trong biểu mẫu rất hữu ích khi gửi yêu cầu POST và có nó trong đầu hữu ích để tiết kiệm thời gian/công sức/sai sót với yêu cầu ajax.

Có lẽ cũng tốt khi có nó trong cả hai vì bạn có thể muốn thực hiện yêu cầu ajax khi không có biểu mẫu. Nếu có một hình thức và javascript bị vô hiệu hóa, có nó trong tiêu đề không làm bất cứ ai ủng hộ vì nó sẽ không được bao gồm trong yêu cầu POST.

Vì sao chúng lại khác nhau, tôi chỉ có thể đoán nó có liên quan đến thuật toán tại thời điểm tạo ... nhưng không có ở đây cũng không có cả hai thẻ làm việc.

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