Rails的 – 如何将CSRF保护添加到在JavaScript中创build的窗体?

我使用的是backbone.js,效果很好。 但我作为一个JavaScript模板创build的表单缺lessrails csrf保护令牌。 如何将它添加到我在JavaScript中创build的模板?

如果您的布局中有<%= csrf_meta_tag %> ,并且可以从js访问,则可以使用$('meta[name="csrf-token"]')访问它

请参阅http://eunikorn.blogspot.com/2011/07/working-with-backbonejs-in-harmony-with.html了解如何在每个主干请求中对csrf支持进行攻击;

我解决这个问题的最好办法是在表格里面:

 <%= hidden_field_tag :authenticity_token, form_authenticity_token %> 

您可以将csrf标记添加到使用“发布”或“删除”的每个表单。 这里是咖啡的脚本:

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

确保你的布局中有<%= csrf_meta_tags%>。 它应该已经在标准的“应用程序”布局,但如果您使用不同的布局添加它。

至于Rails 4.2.2,你不能使用

 <%= hidden_field_tag :authenticity_token, form_authenticity_token %> 

来自.js.erb资产文件。

但是,您可以在.js.erb文件中创build表单,并在包含表单.html.erb文件的视图中使用hidden_field_tag助手来生成令牌元素。 由于这个元素将在表单之外生成,所以可以使用jquery将此元素附加到表单中。

案例研究:SweetAlert(第一版,版本似乎也解决了这个问题)

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 %>