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:
POST
Données sur mon serveur, un jeton CSRF est envoyé.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?
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.