CSRF: Générer un jeton pour chaque demande
Droit maintenant, nous avons jeton csrf par session. Et l'ajout de ce jeton jsp à l'aide du champ caché. l'extrait de code suivant ne donne qu'un seul par session:
token = (String) session.getAttribute(CSRF_TOKEN_FOR_SESSION_NAME);
if (null==token) {
token = UUID.randomUUID().toString();
session.setAttribute(CSRF_TOKEN_FOR_SESSION_NAME, token);
}
et pour chaque demande,
//calls the above snippet and this time token will not be null
String st = CSRFTokenManager.getTokenForSession(request.getSession());
String rt = CSRFTokenManager.getTokenFromRequest(request);
ici, l'usage est égal à comparer les chaînes et retourner true ou false.
ma question est, qu'advient-il si j'essaie de générer le jeton pour chaque demande sans obtenir le jeton de session. Et tout en comparant, je vais obtenir à partir de la session et de la demande. est-ce une bonne idée ou manque quelque chose?
Au lieu d'utiliser le ci-dessus des extraits, je vais aller avec
//for every request generate a new and set in session
token = UUID.randomUUID().toString();
session.setAttribute(CSRF_TOKEN_FOR_SESSION_NAME, token);
//get the token from session and request and compare
String st = (String) request.getSession().getAttribute("CSRF_TOKEN_FOR_SESSION_NAME");
String rt = CSRFTokenManager.getTokenFromRequest(request);
Vous pouvez générer un jeton et ne pas les stocker dans la session. Ajouter un champ caché dans le formulaire et un cookie. Lorsque vous recevez la demande, comparez les valeurs du champ et le cookie.
pas sûr..mais, je pense que les cookies sont vulnérables à une attaque CSRF
user1609085 L'idée de le jeton CSRF est qu'un attaquant tente d'envoyer des "caché" demande d'usurper l'identité d'un autre utilisateur A. L'attaquant utilise un autre site où il pourrait injecter une partie de code javascript malveillant, l'important ici est qu'à partir de ce site, il ne peut pas envoyer le jeton dans le cookie ou dans un en-tête spécial (les navigateurs ne laissez pas l'attaquant le faire), c'est pourquoi le jeton est généralement de là.
pas sûr..mais, je pense que les cookies sont vulnérables à une attaque CSRF
user1609085 L'idée de le jeton CSRF est qu'un attaquant tente d'envoyer des "caché" demande d'usurper l'identité d'un autre utilisateur A. L'attaquant utilise un autre site où il pourrait injecter une partie de code javascript malveillant, l'important ici est qu'à partir de ce site, il ne peut pas envoyer le jeton dans le cookie ou dans un en-tête spécial (les navigateurs ne laissez pas l'attaquant le faire), c'est pourquoi le jeton est généralement de là.
OriginalL'auteur | 2013-05-01
Vous devez vous connecter pour publier un commentaire.
Vous aurez envie de flip autour de l'écoulement que vous avez indiqué ci-dessus. Après tous les comparer, vous devez créer un nouveau jeton.
Un grand inconvénient à jeton-par-requête est de savoir si l'utilisateur clique sur le bouton précédent du navigateur:
TokenA
dans la session.TokenA
. L'application vérifieTokenA
dans la séance et donne à l'utilisateurTokenB
.TokenA
, l'utilisateur clique sur un lien ou soumet un formulaire de Page3 soumettreTokenA
, mais la séance ne sait que surTokenB
À cause de cela, vous avez besoin pour prendre soin de comment et quand les jetons sont mis à jour.
Salut, je sais que c'est un vieux post, mais je suis dans la même situation à l'heure actuelle. Pourriez vous s'il vous plaît vérifier ma compréhension:1) lorsque l'utilisateur visite la page 1, String st = (String) request.getSession().getAttribute("CSRF_TOKEN_FOR_SESSION_NAME"); il est appelé et est null. Après cette Chaîne rt = CSRFTokenManager.getTokenFromRequest(demande); est appelé, ce qui génère et définit une nouvelle valeur à l'attribut de session. Lors de la comparaison fait?
Ce qui va se passer si l'utilisateur actualise la page?
OriginalL'auteur Jay Lindquist
En dehors de la solution proposée par Jay, je vous suggère d'éviter la mise en cache de vos pages web en définissant différents-tête cache-control dans la réponse au client.
OriginalL'auteur Mangu Singh Rajpurohit