2016-04-25 9 views
6

Sto tentando di ottenere il caching completo delle pagine in Rails, ma ho riscontrato un grosso problema riguardo CSRF, o forse solo la mia comprensione. Attualmente ho la stringa form_authenticity_token memorizzata in un cookie con cui JS può accedere e riscrivere i tag di intestazione.Rails 4 token di autenticità - sia nell'intestazione che nell'input nascosto della forma?

Ci sono due posti trovo gettoni nel mio codice HTML generato:

1) nella testa

<meta name="csrf-token" content="[hash]">

2) All'interno elemento di input nascosto di una forma

<input type="hidden" name="authenticity_token" value="[different hash]">

Come indicato, questi hash sono diversi l'uno dall'altro (in modalità di sviluppo in cui la memorizzazione nella cache non è abilitata ndr). Perché sono diversi? Perché posso eliminare i meta tag principali e lasciare solo l'input del modulo e la richiesta è consentita? Eppure quando elimino il tag di input del modulo e lascia le intestazioni la richiesta viene respinta?

Questo significa che i cartellini sono inutili, no? Posso riscrivere il tag di input del modulo sul valore nel mio cookie proprio come ho fatto con i tag di intestazione, ma dal momento che sono diversi l'uno dall'altro sono cauto riguardo a cosa il risultato finale potrebbe significare soprattutto quando si tratta di cache della pagina intera .

Applicazione controller contiene:

protect_from_forgery with: :exception 
before_filter :csrf_cookie 

def csrf_cookie 
    cookies['authenticity-token'.freeze] = { 
    value: form_authenticity_token, 
    expires: 1.day.from_now, 
    secure: (Rails.env.staging? || Rails.env.production?) 
    } 
end 

risposta

2

navigazione in modo su un altro tema led me to the answer. In breve, Rails aiuta gli utenti di jQuery inserendo automaticamente il token CSRF in richieste ajax. Lo cerca nei meta tag.

Quindi avere il token CSRF all'interno del modulo è utile quando si inoltrano richieste POST e averlo in testa è utile per risparmiare tempo/sforzi/errori con richieste Ajax.

Forse è bello averlo in entrambi anche perché potresti voler fare una richiesta di ajax quando non c'è un modulo presente. Se c'è un modulo e javascript è disabilitato, averlo nell'intestazione non fa alcun favore a nessuno dato che non sarà incluso nella richiesta POST.

Per quanto riguarda il motivo per cui sono diversi, posso solo supporre che abbia qualcosa a che fare con l'algoritmo al momento della generazione ... ma non è né qui né lì come funzionano entrambi i token.

Problemi correlati