Pourquoi @Html.AntiForgeryToken() générer des jetons différents dans la même réponse?
Un seul Rasoir vue contient plusieurs formes, chacune avec son propre appel à @Html.AntiForgeryToken()
<form id="f1">
@Html.AntiForgeryToken()
</form>
<form id="f2">
@Html.AntiForgeryToken()
</form>
Si je comprends bien, ces deux anti faux jetons doivent être la même.
<form id="f1">
<input name="__RequestVerificationToken" type="hidden" value="duVT4VtiYybun-61lnSY1ol__qBwawnELooyqT5OSrCJrvcHvDs_Nr9GLxNxwvBaI4hUcKZVkm6mDEmH2UqNorHD1FnJbKJQLWe8Su_dhy_nnGGl5GhqqC3yRGzcxbBM0" />
</form>
<form id="f2">
<input name="__RequestVerificationToken" type="hidden" value="ZMISz3IWHU_HCKP4FppDQ5lvzoYhlQGhN1cmzKBPz4OgDzyqSUK3Q1dqvw1uHsb4eNyd9U3AbFcnW8tR7g1QS8Dyhp0tFc-ee1sfDAOqbLCcgd3PDnLCbXx09pnPREaq0" />
</form>
Pourquoi les valeurs différentes?
Sûrement, ils devraient être les mêmes, parce qu'ils sont envoyés dans la même Réponse du serveur?
Le la documentation ne dit rien au sujet de l'appeler qu'une seule fois.
Gardez à l'esprit que vtortola de l'approche crée une faille de sécurité, comme expliqué dans ma réponse ci-dessous. Les jetons doivent être différentes.
OriginalL'auteur | 2014-03-18
Vous devez vous connecter pour publier un commentaire.
L'Anti-Faux jeton n'est pas comparé directement le serveur a pour ôter la protection de premier et de comparer les données protégées à l'intérieur. Ayant différents protégé jetons ne veut pas forcément dire qu'ils contiennent des données différentes.
Ce que le
System.Web.Helpers.AntiXsrf.TokenValidator
compare est laSecurityToken
à l'intérieur de la décryptéAntiForgeryToken
instances. Ces cas, cependant, contiennent également unAdditionalData
champ, unUserName
champ et unClaimUid
champ.Aussi, le
SecurityToken
à l'intérieur de laAntiForgeryToken
est directement copié à partir de l'actuel (s'il est valide, sinon les frais générés) AntiForgery cookie à l'intérieur deAntiForgeryWorker
.Étant donné que toutes les données sont sérialisées, cryptées, alors codé, vous pouvez avoir des écarts dans les protégés de jeton en raison des différences entre les
AdditionalData
entre des jetons ou elle est probablement due à un pseudo-aléatoires nonce utilisé dans le processus de cryptage (qu'il utilise probablement, puisque je peux tester les 2 complètement différents jetons comme valide par rapport à la même cookie).OriginalL'auteur Daniel Rusznyak
Je crains que cela ne fonctionnera pas.
La antiforgery jeton se déplace aussi dans la réponse cookie, donc la vôtre contiendra uniquement le dernier jeton, et donc la première forme échouera toujours.
Vous pouvez essayer de faire quelque chose comme ceci:
Je l'ai essayé, et le même jeton est utilisé dans les deux formes.
Parce que chaque appel génère un autre jeton, qui est, il n'y a rien de plus à creuser à ce sujet. La MSDN dit "Génère un champ de formulaire masqué (anti-faux jeton) qui est validé lorsque le formulaire est soumis.", donc, qui "Génère", un nouveau sera généré à chaque fois 🙂
parce que si il a renvoyé le même coup à chaque fois que vous l'avez appelé, alors, vous obtiendrez la même manière sur les différentes pages, et quelqu'un pourrait-il suffit de le copier à faire attaque CSRF. si vous avez besoin d'utiliser le jeton dans deux endroits différents (parce que votre page a deux formes), alors c'est la bonne réponse.
rien de mal à cela. Le développeur qui a fait de cette aide a décidé de générer une fois par appel. C'est l'API. C'était le développeur de la décision (probablement beaucoup pesé dans). Si vous souhaitez que le comportement que vous décrivez, de mettre en œuvre vous-même - c'est la beauté de la programmation!
Votre approche crée une faille de sécurité, comme indiqué dans ma réponse ci-dessous. Vous ne devez pas utiliser le même jeton pour chaque formulaire présent dans la page.
OriginalL'auteur vtortola
Les valeurs ONT être différent. Pas à cause de la mise en œuvre de fonctionnement interne ou de l'API vaudou, mais parce que chaque forme représente un indépendant demande au serveur.
Si les formes ont la même occasion, une fois qu'un attaquant savait la valeur du jeton pour un formulaire, il serait en mesure de tromper le serveur accepte les données envoyées par les autres formes, bien qu'ils n'ont pas été soumis par l'utilisateur, en battant la protection prévue par la AntiCSRF Jeton.
L'objectif de la marque est de fournir un id aléatoire de paramètres, ce qui rend très difficile pour l'attaquant de tromper l'application en pensant que c'était de l'utilisateur connecté qui a rempli le formulaire.
Pour ceux qui ne sont pas familiarisés avec les attaques de type CSRF, veuillez jeter un oeil ici.
MitM serait l'une des façons de le voir. L'empoisonnement DNS serait un autre. Les attaques que la défaite de "same-origin policy" (même navigateur android souffre de cette) serait également permettre à un attaquant de lire le contenu de la page, donc lui permettant de lire le jeton via javascript.
Qui s'applique pour un seul formulaire avec un antiforgery jeton. Avec une attaque de type MitM possible, votre jeton de pari visible à partir de la réponse HTML et le Set-Cookie en-tête HTTP. Même si le MitM seulement permis d'intercepter du client vers le serveur, l'attaquant peuvent encore modifier les données que vous envoyez sans connaissances préalables des jetons. Aussi, si un attaquant arrive à lire la page que vous avez dans le navigateur, il n'a pas d'importance si vous avez un jeton dans une forme ou deux jetons dans les deux formes.
Si les jetons de sécurité ne sont pas invalidées lors de l'utilisation, tout ce qu'il faudrait pour moi de créer ma propre utilisateur admin serait à relire l'original de la demande, en changeant uniquement le choisi d'informations d'identification.
Voir owasp.org/index.php/..., spécialement quand il dit: "En général, les développeurs ont besoin seulement de générer ce jeton, une fois pour la session en cours."
OriginalL'auteur DarkLighting
Ce ne sont pas égaux antiforgerytoken commandes.
Le MVC est de générer uniqe pour tous uniqe commandes.
Donc vous ne devriez pas attendre le même ID généré. Comme je sais 🙂
Merci buffjape, pour votre commentaire
Je pense que le navigateur insectes peuvent causer ce problème quelques fois.
OriginalL'auteur Krekkon
La Réponse n'a rien à faire avec elle.
@Html.AntiForgeryToken()
est une méthode statique deHtmlHelper
qui génère un unique jeton est ajouté à la page html et la réponse du témoin. Votre appel à la méthode plusieurs fois, de sorte que votre générant de multiples jetons.Si elle n'a pas de générer un code unique à chaque fois il ne serait pas sûr.
Ne fait aucune différence.
Je ne comprends pas pourquoi vous pensez que l'appel d'une méthode qui retourne un unique valeur, ou pourrait jamais retourner des valeurs en double - son tout simplement pas possible. Son pas différent que de créer une méthode qui a
var a = Guid.NewGuid; var b = Guid.NewGuid;
Les valeurs dea
etb
sera différent. Par votre logique, ils devraient être égaux parce qu'ils sont dans la même méthode. Peut-être vous devriez étudier les code source pour obtenir une meilleure compréhensionSi je comprends bien, le but de @Html.AntiForgeryToken() est de mettre un anti-faux jeton sur la page (afin qu'il corresponde le cookie). Je sais déjà qu'il ne le fait pas. Ce que je suis à la recherche d'une explication rationnelle...
OriginalL'auteur
@Html.AntiForgeryToken() en fait, générer de la valeur chiffrée sur la base du cookie, et les données de formulaire. Donc, si vous déclarer et utiliser ce @Html.AntiForgeryToken() pour chaque qu'il va générer deux _RequestValidationToken. Mieux déclarer un global @jeton variable avec @Html.AntiForgeryToken() la méthode et il va créer un seul jeton pour chaque demande.
OriginalL'auteur Somdev Singh