Rails - 如何在javascript中创建的表单中添加CSRF保护?

时间:2011-12-14 11:05:16

标签: javascript ruby-on-rails ruby-on-rails-3 backbone.js csrf

我正在使用backbone.js,效果很好。但我作为javascript模板创建的表单缺少rails csrf保护令牌。如何将其添加到我在javascript中创建的模板中?

5 个答案:

答案 0 :(得分:59)

最好的办法我在表格中解决了这个问题:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

答案 1 :(得分:30)

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

访问它

有关如何在每个骨干网请求中破解csrf支持的想法,请参阅http://eunikorn.blogspot.com/2011/07/working-with-backbonejs-in-harmony-with.html

答案 2 :(得分:4)

您可以将csrf标记添加到使用“post”或“delete”的每个表单中。这是在coffeescript:

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

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

答案 3 :(得分:1)

我在Rails 6应用程序的Vue组件中有一个表单。

令我惊讶的是,在Vue模板中包含名称为authenticity_token的隐藏输入就足够了,并且在页面加载时,Rails用CSRF保护令牌填充了该值。

例如

<template>
  <div id="app">
    <form
      action="/submit"
      method="post"
      @submit.prevent="onSubmit"
    >
      <input
        type="hidden"
        name="authenticity_token"
        value=""
      >
      <!-- rest of form -->
    </form>
  </div>
</template>

哪个呈现为:

<div id="app">
  <form action="/submit" method="post">
    <input type="hidden" name="authenticity_token" value="zl9PJiE...">
    ...
  </form>
</div>

答案 4 :(得分:0)

对于Rails 4.2.2,您不得使用

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

来自您的.js.erb资产文件。

但是,您可以在.js.erb文件中创建表单,并在包含表单.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 %>