Je suis un PHP développeur qui a appris Ruby on Rails en lisant le didacticiel de Michael Hartl . Voici une citation du livre faisant référence à csrf_meta_tag
:
... la méthode Rails
csrf_meta_tag
[empêche] les requêtes intersites falsification (CSRF), un type d’attaque Web malveillante. Ne vous inquiétez pas pour le détails (je ne le fais pas); Sachez simplement que Rails travaille dur pour garder votre application sécurisée.
Le fait est que je suis vraiment curieux. Comment l'insertion des balises méta csrf-param
et csrf-token
empêche-t-elle CSRF? J'ai essayé Google, mais je n'ai rien trouvé.
csrf_meta_tag
remplit fondamentalement la même chose que les champs de formulaire masqués, mais permet de donner aux requêtes javascript non liées à un formulaire un moyen simple d'obtenir le jeton.
Si vous utilisez la bibliothèque jquery-ujs , le contenu de cette balise méta est automatiquement ajouté (en tant qu'en-tête de requête) à toutes les requêtes ajax effectuées.
Le csrf_meta_tag
insère dans la page ce qui est essentiellement une signature numérique, en agissant comme une vérification que les demandes entrant dans le serveur d'applications proviennent en fait d'utilisateurs bien connectés. Cela permet d'éviter les scripts intersites (un script sur une requête de lancement de page complètement indépendante, par exemple GMail, lorsque vous êtes connecté à votre GMail dans un autre onglet).
Je suppose que pour clarifier, le csrf_meta_tag
n'empêche pas une page non liée de lancer des requêtes à votre GMail (ou à tout autre service qui est la cible de l'attaque), mais la "signature numérique" dans le csrf_meta_tag
est utilisée pour vérifier la validité desdites demandes. Les requêtes non valides (provenant de tentatives de script entre sites) doivent échouer lors de la validation et sont donc rejetées.
Pour le dire autrement, du point de vue de l'attaquant:
Avant que csrf_meta_tags
existe (ils ne sont absolument pas exclusifs de Rails), des attaques de script intersite réussies ont permis à un site malveillant de soumettre des données à une application Web de manière à ce que la demande apparaisse comme si elle était exécutée pour le compte de l'utilisateur. . Supposons donc que vous êtes un administrateur d'un service Web et que, dans un onglet du navigateur, vous êtes connecté au panneau d'administration de ce service. Si un site malveillant ouvert dans un autre onglet cible votre attaque contre votre service, il peut également être en mesure d'exécuter des scripts créant des requêtes administratives, telles que vider la liste d'utilisateurs de la base de données, dérober d'autres données sensibles ou potentiellement endommager, endommager, endommager ou endommager des données. ou détruire les données contenues dans le service, tout en apparaissant (du point de vue du serveur) comme des demandes valides de la part de l’administrateur lui-même. Le csrf_meta_tag
est un moyen de signer des demandes et d’empêcher ces tentatives de réussir.
Il y a une explication beaucoup plus détaillée disponible ici .
Il serait également instructif de faire une "source de vue" sur l’une de vos pages générées par Rails, et vous verrez à quoi ressemble le tag CSRF.
Dans Rails, cela fonctionnera comme ça
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
Voir plus de détails suffit de cliquer
Vous devez également vérifier Guide de sécurité Ruby on Rails
voici le Nice blog
BUT - Je préfère la base de données nationale sur les vulnérabilités, voici la bonne explication
CWE-352: Falsification de requête intersite (CSRF)
Consultez ce document pour CWE - Énumération commune des faiblesses
csrf_meta_tags
sont des indications permettant aux requêtes ajax de les utiliser comme l'un des paramètres de formulaire pour adresser une requête au serveur. Rails s'attend à ce que le fichier csrf fasse partie de votre corps de formulaire (params) pour traiter vos demandes. En utilisant ces balises méta, vous pouvez construire le corps du formulaire ou l’en-tête csrf selon vos besoins. J'espère que cette réponse aide votre question.
Sortie du helper csrf_meta_tags:
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="J/gw2ePXHS9Z1SUSSeUQgMmPhsPEFlFbMrLTLFHLfKjeWh7g4uyOnBlfKnlZlmCBiALDWdDWCSo1z0tybGVtfA==" />
Ce jeton peut être inclus dans la requête 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);
},