Rails: Comment fonctionne la balise meta csrf?
Je suis un développeur PHP apprenant Ruby on Rails en lisant le tutoriel de Michael Hartl . Voici une citation du livre, faisant référence à csrf_meta_tag
:
...la méthode Rails
csrf_meta_tag
[empêche] la requête intersite faux (CSRF), un type d'attaque Web malveillante. Ne vous inquiétez pas au sujet de la détails (je ne le fais pas); sachez simplement que Rails travaille dur pour garder votre application sécurisée.
La chose est, je suis vraiment curieux. Comment l'insertion de balises meta csrf-param
et csrf-token
empêche-t-elle CSRF? J'ai essayé de googler, mais je n'ai rien trouvé.
5 réponses
csrf_meta_tag
remplit fondamentalement la même chose que les champs de formulaire cachés, mais est-il là pour donner des requêtes javascript qui ne sont pas liées à un formulaire un moyen facile d'obtenir le jeton.
Si vous utilisez la bibliothèque jQuery-ujs, le contenu de cette balise meta 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 ce qui est essentiellement une signature numérique dans la page, agissant comme une vérification que les demandes entrant dans le serveur d'applications proviennent, en fait, d'utilisateurs correctement connectés. Cela permet d'empêcher les scripts intersites (un script sur une page complètement indépendante déclenche des demandes hors de dire, GMail, alors que vous êtes connecté à votre GMail dans un autre onglet).
Je suppose que pour clarifier, le csrf_meta_tag
lui-même n'empêche pas une page non liée de déclencher des requêtes vers 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 demandes non valides (c'est-à-dire provenant de tentatives de script intersite) doivent échouer la validation et sont donc rejetées.
Pour le dire autrement, du point de vue de l'attaquant:
Avant l'existence de csrf_meta_tags
(ils ne sont en aucun cas exclusifs à Rails), les attaques de scripts intersites réussies permettaient à un site malveillant de soumettre des données à une application web dans un de manière à ce que la demande apparaisse comme si elle était effectuée au nom de l'utilisateur. Donc, disons que vous êtes un administrateur sur un service web, et dans un onglet du navigateur, vous êtes connecté au panneau d'administration pour ce service. Si un site malveillant ouvert dans un autre onglet Cible votre service pour une attaque, le site malveillant peut être en mesure d'exécuter des scripts qui font des demandes d'administration, tels que le dumping liste d'utilisateurs de la base de données, voler d'autres données sensibles, ou potentiellement nuire, endommager ou détruire les données contenues dans le service, tout en apparaissant (du point de vue du serveur) comme des demandes valides de l'administrateur eux-mêmes. Le csrf_meta_tag
est un moyen de signer des demandes et d'aider à empêcher de telles tentatives de réussir.
Il y a une explication beaucoup plus détaillée disponible ici .
Il serait également éducatif de faire un "view source" sur l'une de vos pages générées par Rails, et vous verrez à quoi ressemble la balise CSRF.
Dans Rails, cela fonctionnera comme ceci
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 cliquez simplement sur
Vous devez également vérifier Ruby on Rails Guide de Sécurité
Voici le joli blog {[5]
Mais-je préfère la base de données nationale de vulnérabilité, voici la bonne explication
CWE-352: contrefaçon de requête intersite (CSRF)
Vérifiez ce document CEMT - Commune de la Faiblesse de l'Énumération
csrf_meta_tags
sont des indications pour des requêtes ajax pour les utiliser comme l'un des paramètres de formulaire pour faire une demande au serveur. Rails attend du csrf dans le cadre de votre corps de formulaire (params) pour traiter vos demandes. En utilisant ces balises meta, vous pouvez construire le corps du formulaire ou l'en-tête csrf pour répondre à vos besoins. J'espère que cette réponse aide votre question.
Sortie de l'assistant 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);
},