Rails - Как добавить CSRF-защиту в формы, созданные в JavaScript? - PullRequest
44 голосов
/ 14 декабря 2011

Я использую backbone.js, и он прекрасно работает. но формы, которые я создаю как шаблон javascript, не имеют токена защиты rails csrf. Как добавить его в шаблоны, которые я создаю в javascript?

Ответы [ 4 ]

60 голосов
/ 13 февраля 2014

Лучший способ решить эту проблему, внутри формы:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
30 голосов
/ 14 декабря 2011

Если у вас есть <%= csrf_meta_tag %> в вашей раскладке где-то, и это доступно вам из js, то вы можете получить к нему доступ, используя $('meta[name="csrf-token"]')

См. http://eunikorn.blogspot.com/2011/07/working-with-backbonejs-in-harmony-with.html для идеи о том, каквзламывать поддержку csrf в каждом магистральном запросе

5 голосов
/ 02 октября 2012

Вы можете добавить токен 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 + "'>")

Убедитесь, что в вашем макете <% = csrf_meta_tags%>. Он уже должен быть в стандартном макете приложения, но добавьте его, если вы используете другой макет.

0 голосов
/ 30 августа 2016

Что касается 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 %>
...