Jeton CSRF génération

C'est une question sur la génération de jetons CSRF.

Habituellement je voudrais générer un jeton à partir d'une pièce unique de données associées à la session de l'utilisateur, et hachée et salé, avec une clé secrète.

Ma question est en ce qui concerne la création de jetons quand il n'est PAS unique, les données de l'utilisateur à utiliser. Les séances ne sont pas disponibles, les cookies ne sont pas une option, l'adresse IP et les choses de cette nature ne sont pas fiables.

Est-il une raison pourquoi je ne peut pas inclure la chaîne de hachage dans le cadre de la demande ainsi?
Exemple de pseudo-code pour générer le jeton et l'intégrer:

var $stringToHash = random()
var $csrfToken = hash($stringToHash + $mySecretKey)
<a href="http://foo.com?csrfToken={$csrfToken}&key={$stringToHash}">click me</a>

Exemple la validation côté serveur du jeton CSRF

var $stringToHash = request.get('key')
var $isValidToken = hash($stringToHash + $mySecrtKey) == request.get('csrfToken')

La chaîne de caractères utilisé dans la table de hachage serait différent sur chaque demande. Tant qu'il a été inclus dans chaque demande, le jeton CSRF de validation pourrait se poursuivre. Depuis, il est de nouveau à chaque demande et uniquement intégré dans la page, en dehors de l'accès au jeton ne serait pas disponible. La sécurité du jeton tombe alors à l' $mySecretKey être connu que pour moi.

Est-ce une approche naïve? Ai-je raté quelque raison pourquoi cela ne peut pas fonctionner?

Grâce

  • La solution proposée est vulnérable à des attaques de relecture. Le même jeton et une combinaison de touches fonctionnera indéfiniment.
InformationsquelleAutor Jim Beam | 2009-11-26