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

59
demandé sur Oxfist 2012-04-03 19:36:43

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.

70
répondu Frederick Cheung 2012-04-03 16:09:24

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.

54
répondu jefflunt 2012-08-20 14:30:01

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)

CWE-79: Neutralisation incorrecte de L'entrée pendant la génération de Page Web ('cross-site Scripts')

Vérifiez ce document CEMT - Commune de la Faiblesse de l'Énumération

13
répondu AMIC MING 2012-04-03 16:45:50

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.

4
répondu praveenag 2015-06-01 13:17:30

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);
    },
0
répondu artamonovdev 2018-02-15 08:11:44