2011-12-14 33 views

Trả lời

26

Nếu bạn có <%= csrf_meta_tag %> trong cách bố trí của bạn ở đâu đó và có thể truy cập để bạn từ js, sau đó bạn có thể truy cập nó bằng cách sử $('meta[name="csrf-token"]')

Xem http://eunikorn.blogspot.com/2011/07/working-with-backbonejs-in-harmony-with.html cho một ý tưởng về cách hack trong hỗ trợ CSRF vào từng yêu cầu xương sống

+2

eunikorn bây giờ là liên kết bị hỏng – Crisfole

+1

Xem https://gist.github.com/3482636 để biết ví dụ khác về cách thức này có thể bị tấn công. Tôi không biết liệu nó có giống nhau hay không. – Crisfole

+0

Vâng khái niệm là như nhau. –

4

Bạn có thể thêm mã thông báo csrf vào mọi biểu mẫu sử dụng 'bài đăng' hoặc 'xóa'. Dưới đây là trong coffeescript:

$ -> 
    for f in $("form") 
    if f.method == 'post' or f.method == 'delete' 
     $(f).prepend("<input type='hidden' name='authenticity_token' value='" + token + "'>") 

Đảm bảo bạn có <% = csrf_meta_tags%> trong cách bố trí của bạn. Nó đã có trong bố cục 'ứng dụng' chuẩn, nhưng thêm nó nếu bạn đang sử dụng một bố cục khác.

+2

'Mã thông báo' được khai báo ở đâu? – juliangonzalez

+0

@suga_shane nghĩa là gì bằng cách viết, "đảm bảo bạn có' <% = csrf_meta_tags%> '", là trình trợ giúp Rails này tạo ra một mã thông báo cho bạn và chèn nó vào đầu 'HTML' hay không. Mã thông báo là thuộc tính 'content' trong thẻ' 'có tên' csrf-token'. – sameers

48

Cách tốt nhất tôi giải quyết này, bên trong có dạng:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %> 
+0

Nó hoạt động, nhưng tại sao? Không phải là ['form_authenticity_token'] (http://apidock.com/rails/ActionController/RequestForgeryProtection/form_authenticity_token) riêng trong bộ điều khiển? –

+0

Điều này không phù hợp với tôi Rails 4.2.2. Tôi nhận được: 'undefined local variable hoặc method 'form_authenticity_token' cho # <# : 0x007ff7eec39b58>' – juliangonzalez

+0

Chào các bạn, có vẻ như 'form_authenticity_token' là riêng tư cho các bộ điều khiển như Franklin nói. Những gì tôi thấy là một gợi ý đã khai báo một biến trong một bộ điều khiển '@form_token = form_authenticity_token' và sử dụng nó trong khung nhìn. – lucianosousa

0

Đối với Rails 4.2.2 bạn không được phép sử dụng

<%= hidden_field_tag :authenticity_token, form_authenticity_token %> 

từ tập tin tài sản .js.erb của bạn.

Tuy nhiên Bạn có thể tạo biểu mẫu bên trong tệp .js.erb và trong chế độ xem có chứa biểu mẫu .html.erb tệp sử dụng trình trợ giúp hidden_field_tag để tạo phần tử mã thông báo. Vì phần tử này sẽ được tạo bên ngoài biểu mẫu, bạn có thể sử dụng jquery để chắp thêm phần tử này vào biểu mẫu.

Trường hợp nghiên cứu: SweetAlert (phiên bản đầu tiên, phiên bản quá dường như đã giải quyết vấn đề này)

show.js.erb

$('.js-button-apply-offer').click(function(e) { 
var urlOffer = $(this).attr('data-url-offer'); 
var modalParams = { 
    type: 'warning', 
    title: 'add file', 
    text: '<p>Need to add a file before continuing</p>' // This is a hack for Sweet alert, solved in SweetAlert2 Consider upgrade 
    +"<form action='"+urlOffer+"' id='formCustomCV' method='post' enctype='multipart/form-data' data-remote='true'>" 
    + "<input type='file' name='custom_cv' id='fileToUploadAlert' accept='application/pdf'>\n" 
    +"</form>", 
    html: true, 
    showCancelButton: true, 
    confirmButtonColor: '#DD6B55', 
    confirmButtonText: 'Send', 
    cancelButtonText: 'Cancel', 
    closeOnConfirm: false 
    } 
swal(modalParams, 
function(){ 
    var form_token = $('#form_token'); 
    $('#formCustomCV').append(form_token).submit(); //update to submit using ajax 
}); 

show.html.erb

<%= button_tag t('offers.offer.apply'), 
    class: 'center-block btn btn-success js-button-apply-offer', 
    id: "js-button-apply-offer", 
    data: { 
    url_offer: apply_talents_offer_path(@offer), 
    } 
%> 
<%= hidden_field_tag :authenticity_token, form_authenticity_token, id: :form_token %> 
Các vấn đề liên quan