web-dev-qa-db-fra.com

Rails: Comment fonctionne csrf_meta_tag?

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é.

60
Nick

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.

70
Frederick Cheung

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.

54
jefflunt

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)

CWE-79: Neutralisation incorrecte des entrées lors de la génération de pages Web ('script entre sites')

Consultez ce document pour CWE - Énumération commune des faiblesses

14
AMIC MING

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.

4
praveenag

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);
    },
1
artamonovdev