web-dev-qa-db-fra.com

Pourquoi le jeton CSRF devrait être dans une balise META et dans un cookie?

Quelle est la nécessité de mettre le nom et la valeur du jeton CSRF dans la balise <head> en utilisant <meta> comme:

par exemple:

<meta content="authenticity_token" name="csrf-param" />
<meta content="4sWPhTlJAmt1IcyNq1FCyivsAVhHqjiDCKRXOgOQock=" name="csrf-token" />

J'ai lu sur le concept de conserver la valeur CSRF dans le cookie, mais ne trouve pas pourquoi rester à l'intérieur de la balise <head>.

28
Vin.AI

Pour empêcher CSRF , vous avez besoin d'une valeur soumise avec la demande qui ne peut pas être envoyée par un site malveillant. Les cookies d'authentification ne conviennent pas car si un attaquant peut demander au navigateur d'envoyer une demande au site victime, les cookies seront automatiquement envoyés.

Par exemple, en soumettant un formulaire via JavaScript contenu sur www.evil.com pour attaquer la session de l'utilisateur le www.example.com:

<form method="post" action="https://www.example.com/executeAction">
    <input type="hidden" name="action" value="deleteAllUsers">
</form>

<script>document.forms[0].submit()</script>

Le stockage d'un jeton anti CRSF dans la page est la [~ # ~] owasp [~ # ~] solution recommandée pour empêcher un autre site Web de soumettre le formulaire, car le jeton aléatoire de la session de l'utilisateur ne peut pas être lu par www.evil.com en raison de la même politique d'origine empêchant JavaScript sur www.evil.com lecture du contenu de la page de www.example.com.

Ces jetons peuvent être stockés n'importe où dans la page. Le plus souvent, il se trouvera dans des champs de formulaire masqués, mais ils pourraient également être stockés dans les attributs de données HTML 5 . Il semble que l'utilisation des balises meta soit simplement une autre façon de les stocker, où le JavaScript peut les inclure dans toutes les soumissions de formulaires effectuées par la page.

21
SilverlightFox

Les jetons CSRF se présentent normalement sous la forme de champs de formulaire masqués. Les placer dans une balise META n'a de sens que si vous utilisez JavaScript. JavaScript pourrait lire les jetons de la balise META et les publier dans une action.

Vous ne voudriez pas mettre un jeton CSRF dans un cookie, car le cookie sera envoyé pour chaque demande au site Web spécifique à partir du navigateur Web, quelle que soit son origine. La seule exception serait cookies sécurisés, qui sont censés suivre la même politique d'origine.

10
Marcus Adams

En effet, rien n'empêche un site Web incriminé de publier des données sur un site Web légitime, ce qui pourrait inclure votre ticket d'authentification et votre jeton CSRF. Imaginez ce scénario ... tiré de ASP.NET

  1. Un utilisateur se connecte à www.siteA.com, en utilisant l'authentification par formulaire.
  2. Le serveur authentifie l'utilisateur. La réponse du serveur comprend un cookie d'authentification.
  3. Sans se déconnecter, l'utilisateur visite un site Web malveillant. Ce site malveillant contient le formulaire HTML suivant:

    <h1>You Are a Winner!</h1>
        <form action="http://siteA.com/api/account" method="post">
            <input type="hidden" name="Transaction" value="withdraw" />
            <input type="hidden" name="Amount" value="1000000" />
     <input type="submit" value="Click Me"/>
        </form>
    

Notez que l'action de formulaire est publiée sur le site vulnérable et non sur le site malveillant. Il s'agit de la partie "intersite" du CSRF.

L'utilisateur clique sur le bouton soumettre. Le navigateur inclut le cookie d'authentification avec la demande. La demande s'exécute sur le serveur avec le contexte d'authentification de l'utilisateur et peut faire tout ce qu'un utilisateur authentifié est autorisé à faire.

Donc, fondamentalement, lorsque siteA.com reçoit l'attaque CSRF, il doit faire correspondre le jeton CSRF du cookie avec celui de la balise META. Une demande légitime comprendra les deux, cependant, une attaque par contrefaçon n'inclura que le jeton CSRF spécifié dans le cookie.

4
Leo

La seule option que je pourrais imaginer est de rendre ces données accessibles à partir de JavaScript. De cause juste au cas où les cookies sont uniquement http.

1
rekire