2012-04-03 8 views
57

Sono uno sviluppatore PHP che sta imparando Ruby on Rails leggendo Michael Hartl's tutorial. Ecco una citazione dal libro, riferendosi a csrf_meta_tag:Rails: come funziona csrf_meta_tag?

... the Rails metodo csrf_meta_tag [evita] cross-site request contraffazione (CSRF), un tipo di attacco web malevolo. Non preoccuparti dei dettagli di (non lo faccio); Sappi solo che Rails sta lavorando duramente per mantenere l'applicazione protetta.

Il fatto è che sono sinceramente curioso. In che modo l'inserimento dei meta tag csrf-param e csrf-token impedisce CSRF? Ho provato su Google, ma non ho trovato nulla.

+2

Permettetemi di Google che per voi http://stackoverflow.com/questions/941594/understand-rails-authenticity-token –

+6

@MikhailNikalyukin Grazie (I pensare). Questo spiega CSRF, di cui conoscevo già le basi, ma non spiega come * i meta tag * (in contrapposizione ai campi dei moduli nascosti) possano impedirlo. Conosci la risposta a questo? – Nick

risposta

68

csrf_meta_tag soddisfa sostanzialmente la stessa funzione dei campi di moduli nascosti ma è in grado di fornire richieste javascript che non sono legate a un modulo un modo semplice per ottenere il token.

Se si utilizza la libreria jquery-ujs, il contenuto di tale metatag viene automaticamente aggiunto (come intestazione della richiesta) a qualsiasi richiesta Ajax effettuata.

+0

Breve e dolce. Hai risposto alla mia domanda. Grazie! – Nick

+0

Solo per completare: [questo articolo] (http://robots.thoughtbot.com/a-tour-of-rails-jquery-ujs) menziona che gli ujs possono anche usarli per aggiornare le cache dei frammenti obsolete. [Linea sorgente uJS pertinente] (https://github.com/rails/jquery-ujs/blob/57f4848652584f33018e46414605a873194a97d7/src/rails.js#L57). E nel caso ci fossero delle newb come me: "form_tag" e altri helper aggiungono anche il token CSRF al modulo, quindi funzionano senza Js. –

52

Il csrf_meta_tag inserisce nella pagina la firma digitale, che funge da verifica che le richieste che arrivano nel server delle applicazioni sono, infatti, da utenti che hanno effettuato correttamente l'accesso. Questo aiuta a prevenire lo scripting cross-site (uno script su una pagina completamente indipendente che licenzia le richieste per dire, GMail, mentre sei connesso al tuo GMail in un'altra scheda).

immagino di chiarire, il csrf_meta_tag per sé non impedisce una pagina non correlata da sparando richieste di Gmail (o qualsiasi altro servizio che è l'obiettivo dell'attacco), ma la "firma digitale" nel csrf_meta_tag è utilizzato per verificare la validità di tali richieste. Le richieste non valide (ad esempio dai tentativi di scripting cross-site) non sono valide per la convalida e vengono pertanto scartate.

Per dirla in un altro modo, dal punto di vista dell'attaccante:

Prima csrf_meta_tags esistito (che non sono esclusivi di rotaie con qualsiasi mezzo), di successo attacchi cross-site scripting consentito un sito dannoso per inviare i dati a un'app Web in modo tale da far apparire la richiesta come se venisse eseguita per conto dell'utente. Supponiamo che tu sia un amministratore di un servizio Web e in una scheda del browser sei connesso al pannello di amministrazione per quel servizio. Se un sito malevolo aperto in un'altra scheda ha come obiettivo il tuo servizio per un attacco, il sito dannoso potrebbe essere in grado di eseguire script che effettuano richieste di amministrazione, come l'elenco di utenti che scaricano dal database, rubando altri dati sensibili o potenzialmente dannosi, dannosi, o distruggendo i dati contenuti nel servizio, tutti mentre appaiono (dal punto di vista del server) come richieste valide da parte dell'amministratore stesso. Il csrf_meta_tag è un modo per firmare le richieste e aiutare a contrastare tali tentativi di successo.

C'è una spiegazione molto più dettagliata available here.

Sarebbe anche educativo per fare un "visualizza sorgente" su una delle pagine Rails-generate, e vedrete che cosa il tag CSRF assomiglia.

+1

Grazie per la risposta dettagliata! Sebbene sia stato utile e sono stato in grado di imparare da esso, non ha spiegato come * i meta tag * aiutano la prevenzione CSRF (al contrario, ad esempio, dei campi di moduli nascosti). Ma apprezzo davvero il tuo tempo. Grazie ancora! – Nick

13

In Rails che funzionerà come in questo modo

def csrf_meta_tags 
    if protect_against_forgery? 
     [ 
     tag('meta', :name => 'csrf-param', :content => request_forgery_protection_token), 
     tag('meta', :name => 'csrf-token', :content => form_authenticity_token) 
     ].join("\n").html_safe 
    end 
    end 

See more details just click

È inoltre necessario verificare Ruby On Rails Security Guide

qui è il bello blog

MA - National Vulnerability che preferisco Database, ecco la buona spiegazione

CWE-352: Cross-Site Request Forgery (CSRF)

CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

Check this document for CWE - Common Weakness Enumeration

+1

Ottimi collegamenti al database delle vulnerabilità! – jefflunt

+2

Grazie per la risposta dettagliata! Sebbene sia stato utile e sono stato in grado di imparare da esso, non ha spiegato come * i meta tag * aiutano la prevenzione CSRF (al contrario, ad esempio, dei campi di moduli nascosti). Il link al codice sorgente ha spiegato che un po ', però. Ad ogni modo, apprezzo davvero il tuo tempo. Grazie ancora! – Nick

+0

Ciao Nick, ho la direzione della domanda, cambierò la mia risposta molto presto e ti aggiornerò. Principalmente in questo fine settimana. –

4

csrf_meta_tags sono indicazioni per le richieste Ajax per utilizzare questi come uno dei parametri modulo per effettuare una richiesta al server. Rails si aspetta che csrf faccia parte del corpo del modulo (params) per elaborare le tue richieste. Usando questi meta tag è possibile costruire il corpo del modulo o l'intestazione csrf in base alle proprie esigenze. Spero che questa risposta aiuti la tua domanda.

0

uscita della aiutante csrf_meta_tags:

<meta name="csrf-param" content="authenticity_token" /> 
<meta name="csrf-token" content="J/gw2ePXHS9Z1SUSSeUQgMmPhsPEFlFbMrLTLFHLfKjeWh7g4uyOnBlfKnlZlmCBiALDWdDWCSo1z0tybGVtfA==" /> 

Questo token può essere incluso in richiesta AJAX. exapmle (jquery-ujs):

https://github.com/rails/jquery-ujs/blob/4b6e30f68ff1244fc0c790641d3408c2695a29bd/src/rails.js#L70

csrfToken: function() { 
    return $('meta[name=csrf-token]').attr('content'); 
    }, 

    // URL param that must contain the CSRF token 
    csrfParam: function() { 
    return $('meta[name=csrf-param]').attr('content'); 
    }, 

    // Make sure that every Ajax request sends the CSRF token 
    CSRFProtection: function(xhr) { 
     var token = rails.csrfToken(); 
     if (token) xhr.setRequestHeader('X-CSRF-Token', token); 
    }, 
Problemi correlati