2011-12-14 16 views

Respuesta

26

Si tiene <%= csrf_meta_tag %> en su diseño en alguna parte y que sea accesible a usted de los js, entonces se puede acceder a él mediante $('meta[name="csrf-token"]')

Ver http://eunikorn.blogspot.com/2011/07/working-with-backbonejs-in-harmony-with.html por una idea sobre cómo cortar en apoyo csrf en cada solicitud columna vertebral

+2

eunikorn es ahora un enlace roto – Crisfole

+1

Ver https://gist.github.com/3482636 para otro ejemplo de cómo esto puede ser hackeado en. no tengo ni idea de si es la misma. – Crisfole

+0

Sí, el concepto es el mismo. –

4

puede anteponer el token CSRF a cada formulario que utiliza 'post' o 'eliminar'. Aquí está en CoffeeScript:

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

Asegúrese de que tiene <% = csrf_meta_tags%> en su diseño. Ya debería estar en el diseño estándar de 'aplicación', pero agréguelo si está usando un diseño diferente.

+2

¿Dónde se declara 'token'? Lo que significa – juliangonzalez

+0

@suga_shane escribiendo "asegúrese de que tiene' <% =% csrf_meta_tags> '", es que este Rieles ayudante genera un testigo para usted y lo inserta en el 'head' HTML. El token es el atributo 'contenido en materia en la etiqueta' ' con el nombre' csrf-token'. – sameers

48

mejor manera que resolvió este, dentro del formulario:

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

Funciona, pero ¿por qué? ¿No es [ 'form_authenticity_token'] (http://apidock.com/rails/ActionController/RequestForgeryProtection/form_authenticity_token) privado en el controlador? –

+0

Esto no funciona para mí Rails 4.2.2. Me sale: 'variable local o método no definido 'form_authenticity_token' para # <# :>' 0x007ff7eec39b58 – juliangonzalez

+0

Hola chicos, parece que 'form_authenticity_token' es privado para los controladores como Franklin dijo. Lo que vi como una sugerencia fue declarar una variable en un controlador '@form_token = form_authenticity_token' y usarla en la vista. – lucianosousa

0

En cuanto a los carriles 4.2.2 no se le permite utilizar

<%= hidden_field_tag :authenticity_token, form_authenticity_token %> 

de su archivo .js.erb activos.

Sin embargo, puede crear el formulario dentro del archivo .js.erb y en la vista que contiene el archivo de forma .html.erb utilizar el hidden_field_tag ayudante para generar el elemento token. Como este elemento se generará fuera del formulario, puede usar jquery para agregar este elemento al formulario.

Caso de estudio: SweetAlert (primera versión, la versión también parece haber resuelto este problema)

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