web-dev-qa-db-fra.com

Quelle est la fréquence de la mise à jour de jeton dans la sécurité CSRF?

Pour commencer avec l'arrière-plan, ce post est ce que Jeff Atwood dit à propos des jetons CSRF. Dans cette page même, il continue à dire:

Une méthode de prévention encore plus forte, bien que plus complexe consiste à tirer parti de l'état du serveur - de générer (et de suivre, avec le délai d'attente) une clé aléatoire unique pour chaque formulaire HTML que vous envoyez au client. Nous utilisons une variante de cette méthode sur le débordement de la pile avec un grand succès.

Mais dans ce poste lui-même, Jeff ne remarque jamais quand et comment les jetons devraient être mis à jour.

J'utilisais une technique similaire dans une application Web que je travaillais. Cela fonctionne comme ceci:

  1. Chaque fois que l'utilisateur POST Données sur mon serveur, un jeton CSRF est envoyé.
  2. Ce jeton CSRF est stocké dans un biscuit cryptographiquement fort en session de l'utilisateur.
  3. Si le jeton est valide, la demande de l'utilisateur est traitée et inversement.
  4. Si la demande est valide, jetez l'ancien jeton sur le côté serveur et créez un nouveau jeton. La réponse du serveur contient un nouveau jeton CSRF à utiliser dans la demande suivante. L'ancien jeton sur toutes les formes sur une page est mis à jour avec le nouveau pour que la demande suivante soit traitée correctement.

Est-il sage de mettre à jour les jetons après la requête POST _ Demande ou si la mise à jour ne doit-elle pas être effectuée que lorsque l'utilisateur fait une requête GET et conservez le même jeton jusqu'à la demande suivante?

9
c0da

Le point principal d'un jeton CSRF est qu'il ne peut pas avoir été envoyé d'un autre site. Donc, donc le (a) ne peut donc pas être prédit ou détecté par un attaquant, et (b) n'est pas automatiquement attaché à une demande de la manière dont un cookie est.

Tellement théoriquement si un jeton CSRF n'est jamais divulgué à des tiers, à nouveau théoriquement, vous n'avez pas à les expirer du tout. Mais alors vous courez le risque de votre jeton de "fuite" en quelque sorte. Donc, votre période d'expiration devrait vraiment être suffisamment courte pour lutter contre la perspective d'un jeton sortir et d'être utilisé contre votre utilisateur.

Il n'y a pas vraiment de directives, mais une bonne technologie solide est de générer automatiquement une nouvelle jeton sur chaque demande qui intègre un code temporel signé, puis acceptez les jetons jusqu'à un certain âge.

Une fonction d'échantillon peut être:

concat(current_time,salt,sha256_sum(concat(salt,userid,current_time,secret_string)))

Le jeton contient des informations de synchronisation et un sel, mais contient également une signature qui ne peut pas être forgée et qui est liée à l'ID utilisateur.

Ensuite, vous pouvez définir votre propre intervalle d'expiration - une heure, une journée, 2 heures. Peu importe. L'intervalle dans ce cas n'est pas lié au jeton, vous êtes donc libre de définir des règles d'expiration, mais vous le souhaitez.

À tout le moins, cependant, les jetons CSRF devraient expirer lorsque la session de connexion expire ou lorsque l'utilisateur se déconnecte. L'utilisateur ne vous attend que d'une forme que vous avez soulevée avant votre déconnexion continuera de fonctionner après votre reconnaissance.

10
tylerl