11
votes

ASP.NET Biscuits Bug - Plusieurs cookies dupliqués au hasard?

Il semble qu'il y ait un bogue ennuyeux dans la gestion des cookies ASP.NET lors de l'écriture de la réponse à la réponse au fil. Set-Cookie Code> Les en-têtes sont multipliés de manière aléatoire.

Mon exemple de configuration est le suivant: asp.net mvc4 em> sur iis8 express em> serveur, mais le même problème se produit sur mode intégré IIS7 em>, et j'ai trouvé des messages sur le même problème iis6 em> retour en 2009. Il semble être question existe pendant un moment. P>

pour Exemple, dans global.aSax.cs, je m'abonne à l'événement BNTPRESPONSE.COOKIE COLLECTION dans mon gestionnaire d'événements: P>

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
Set-Cookie: OnBeginRequest=0; path=/
Set-Cookie: OnBeginRequest=0; path=/
Set-Cookie: OnAuthenticateRequest=1; path=/
Set-Cookie: OnBeginRequest=0; path=/
Set-Cookie: OnAuthenticateRequest=1; path=/
Set-Cookie: OnPostAuthenticateRequest=2; path=/
Set-Cookie: OnBeginRequest=0; path=/
Set-Cookie: OnAuthenticateRequest=1; path=/
Set-Cookie: OnPostAuthenticateRequest=2; path=/
Set-Cookie: OnAuthorizeRequest=3; path=/
Set-Cookie: OnPostAuthorizeRequest=4; path=/
Set-Cookie: OnBeginRequest=0; path=/
Set-Cookie: OnAuthenticateRequest=1; path=/
Set-Cookie: OnPostAuthenticateRequest=2; path=/
Set-Cookie: OnAuthorizeRequest=3; path=/
Set-Cookie: OnPostAuthorizeRequest=4; path=/
Set-Cookie: OnResolveRequestCache=5; path=/
Set-Cookie: OnPostResolveRequestCache=6; path=/
Set-Cookie: OnBeginRequest=0; path=/
Set-Cookie: OnAuthenticateRequest=1; path=/
Set-Cookie: OnPostAuthenticateRequest=2; path=/
Set-Cookie: OnAuthorizeRequest=3; path=/
Set-Cookie: OnPostAuthorizeRequest=4; path=/
Set-Cookie: OnResolveRequestCache=5; path=/
Set-Cookie: OnPostResolveRequestCache=6; path=/
Set-Cookie: OnMapRequestHandler=7; path=/
Set-Cookie: OnBeginRequest=0; path=/
Set-Cookie: OnAuthenticateRequest=1; path=/
Set-Cookie: OnPostAuthenticateRequest=2; path=/
Set-Cookie: OnAuthorizeRequest=3; path=/
Set-Cookie: OnPostAuthorizeRequest=4; path=/
Set-Cookie: OnResolveRequestCache=5; path=/
Set-Cookie: OnPostResolveRequestCache=6; path=/
Set-Cookie: OnMapRequestHandler=7; path=/
Set-Cookie: OnPostMapRequestHandler=8; path=/
Set-Cookie: OnAcquireRequestState=9; path=/
Set-Cookie: OnPostAcquireRequestState=10; path=/
Set-Cookie: OnPreRequestHandlerExecute=11; path=/
X-AspNetMvc-Version: 4.0
X-AspNet-Version: 4.0.30319
Set-Cookie: OnBeginRequest=0; path=/
Set-Cookie: OnAuthenticateRequest=1; path=/
Set-Cookie: OnPostAuthenticateRequest=2; path=/
Set-Cookie: OnAuthorizeRequest=3; path=/
Set-Cookie: OnPostAuthorizeRequest=4; path=/
Set-Cookie: OnResolveRequestCache=5; path=/
Set-Cookie: OnPostResolveRequestCache=6; path=/
Set-Cookie: OnMapRequestHandler=7; path=/
Set-Cookie: OnPostMapRequestHandler=8; path=/
Set-Cookie: OnAcquireRequestState=9; path=/
Set-Cookie: OnPostAcquireRequestState=10; path=/
Set-Cookie: OnPreRequestHandlerExecute=11; path=/
Set-Cookie: OnPostRequestHandlerExecute=12; path=/
Set-Cookie: OnReleaseRequestState=13; path=/
Set-Cookie: OnPostReleaseRequestState=14; path=/
Set-Cookie: OnBeginRequest=0; path=/
Set-Cookie: OnAuthenticateRequest=1; path=/
Set-Cookie: OnPostAuthenticateRequest=2; path=/
Set-Cookie: OnAuthorizeRequest=3; path=/
Set-Cookie: OnPostAuthorizeRequest=4; path=/
Set-Cookie: OnResolveRequestCache=5; path=/
Set-Cookie: OnPostResolveRequestCache=6; path=/
Set-Cookie: OnMapRequestHandler=7; path=/
Set-Cookie: OnPostMapRequestHandler=8; path=/
Set-Cookie: OnAcquireRequestState=9; path=/
Set-Cookie: OnPostAcquireRequestState=10; path=/
Set-Cookie: OnPreRequestHandlerExecute=11; path=/
Set-Cookie: OnPostRequestHandlerExecute=12; path=/
Set-Cookie: OnReleaseRequestState=13; path=/
Set-Cookie: OnPostReleaseRequestState=14; path=/
Set-Cookie: OnUpdateRequestCache=15; path=/
Set-Cookie: OnPostUpdateRequestCache=16; path=/
Set-Cookie: OnLogRequest=17; path=/
Set-Cookie: OnPostLogRequest=18; path=/
Set-Cookie: OnEndRequest=19; path=/
Set-Cookie: OnBeginRequest=0; path=/
Set-Cookie: OnAuthenticateRequest=1; path=/
Set-Cookie: OnPostAuthenticateRequest=2; path=/
Set-Cookie: OnAuthorizeRequest=3; path=/
Set-Cookie: OnPostAuthorizeRequest=4; path=/
Set-Cookie: OnResolveRequestCache=5; path=/
Set-Cookie: OnPostResolveRequestCache=6; path=/
Set-Cookie: OnMapRequestHandler=7; path=/
Set-Cookie: OnPostMapRequestHandler=8; path=/
Set-Cookie: OnAcquireRequestState=9; path=/
Set-Cookie: OnPostAcquireRequestState=10; path=/
Set-Cookie: OnPreRequestHandlerExecute=11; path=/
Set-Cookie: OnPostRequestHandlerExecute=12; path=/
Set-Cookie: OnReleaseRequestState=13; path=/
Set-Cookie: OnPostReleaseRequestState=14; path=/
Set-Cookie: OnUpdateRequestCache=15; path=/
Set-Cookie: OnPostUpdateRequestCache=16; path=/
Set-Cookie: OnLogRequest=17; path=/
Set-Cookie: OnPostLogRequest=18; path=/
Set-Cookie: OnEndRequest=19; path=/
Set-Cookie: OnPreSendRequestContent=20; path=/
Set-Cookie: OnPreSendRequestHeaders=21; path=/
X-Powered-By: ASP.NET
Date: Mon, 20 May 2013 10:47:20 GMT
Content-Length: 4002


4 commentaires

Utilisez quelque chose comme débog.write ("fichier application_beginrequest:" + httpcontext.current.request.path); pour voir ce qui appelle cela.


Application_beginrequest () est appelé qu'une fois par demande. Le problème se produit au niveau inférieur, peut-être dans System.Web.dll, pas dans le code de l'utilisateur.


Avez-vous vu ceci: Stackoverflow.com/Questtions/1139566/...


Oui, j'ai vu cela aussi. Double-vérifié avant d'écrire un message. Les événements ne tirent pas deux fois. Le problème est créé lorsque vous écrivez à httpresponse.cookies à différentes étapes de la demande de vie de la demande de vie (Demande de départ, Séance-Start, etc.). De plus, dans le message que vous vous référez, Cookie serait écrit dans 2 en-têtes de demande différents (page et fichier CSS) au lieu de plusieurs fois dans la même en-tête.


4 Réponses :


-1
votes

Lorsque vous définissez une valeur sur la cookie, effacez-la d'abord, avec .clear () xxx


1 commentaires

Au départ, je pensais que ça ne marchera pas, mais fait quelque chose. Les répétitions sont parties, mais les valeurs de cookies sont corrompues dans certains cas, par exemple si certains cookies sont écrasés, d'autres personnes en vrac (WTF?). Set-Cookie: Onbeginrequest =; Chemin = / Set-Cookie: Onaquirerequest = 2; Chemin = / Set-Cookie: OnpostacquirequestState =; chemin = / mais semble avoir la peine d'explorer.



-1
votes

Si vous naviguez entre les pages après avoir changé la valeur de la cookie sans retourner au client (serveur.transfer) des cookies sera dupliqué.


0 commentaires

6
votes

L'impact de l'insecte IIS 7 n'est probablement pas le même bogue que l'IIS6 touché. Ce bogue a été corrigé à partir de 4.7, il bogue en question a l'identifiant suivant: Devid 289778 .

fond

Voici une description de celui-ci: Dans IIS7, chaque fois que vous quittez le pipeline ASP.NET pour revenir au pipeline IIS, des en-têtes de cookie sont ajoutés, si nécessaire. En mode intégré, vous laissez le pipeline ASP.NET entre la plupart des événements.

Donc, quand il écrit des cookies au besoin, il vérifie si des cookies ont été supprimés. Sinon, il vérifie si des cookies ont été ajoutés. Si c'est le cas, il ajoute un en-tête pour ce cookie. Il vérifie également si des cookies ont été modifiés. Si c'est le cas, il ajoute un en-tête pour cela. Bien que cela itère les cookies, cela prend note de tout ce qui est modifié.

Si des cookies ont été supprimés ou que tout a été modifié, il supprime tous les en-têtes de cookie Ensemble et écrit un nouvel ensemble. (Ou au moins il essaie. Si des en-têtes ont été rincé, il n'est évidemment pas possible.)

jusqu'à présent si bon. Toutefois, lors de la réintégration du pipeline géré, nous lisons les en-têtes de réponse de la réponse et reconstituer les cookies de réponse. Ceci est nécessaire car un module non géré peut avoir ajouté de nouveaux cookies de réponse. Ce faisant, il ne définit pas le drapeau ajouté pour aucun cookies copié des en-têtes de réponse. Jusqu'à présent, tout est toujours bon, non?

Le bug

Bien pas exactement. Chaque fois qu'un cookie est ajouté (ou supprimé de) la collection , la collection request.cokies.cookies est entièrement rechargée, puis les cookies de réponse sont ajoutés à celui-ci. , Réglage de l'indicateur Ajouter sur le httpcookie à nouveau. Ceci est le bug. Cela entraîne l'installation du drapeau supplémentaire sur chaque cookie de réponse chaque fois que tout autre cookie est ajouté ou supprimé.

Cela signifie que si vous ne modifiez pas ou ne supprimez aucun cookies, mais vous en ajoutez au moins un, Ensuite, tous les cookies précédemment ajoutés dans d'autres étapes de pipeline seront dupliqués. Cependant, si vous modifiez un cookie ou supprimez tout cookie de la collection , vous éliminez tous les duplicats précédemment survenus.

La solution de contournement piraquine

Travailler autour de ce bogue, ajoutez simplement et supprimez un cookie arbitraire, ou modifiez un cookie pendant le même événement que les en-têtes sont écrits. Normalement, ce serait Endrequest , sauf si vous utilisez serveur.transfer , serveur.redirect , interface.flush , ou reponse.end (sauf si vous définissez le paramètre endreponse sur false) n'importe où dans l'application, auquel cas vous devez le faire dans le même événement que ceux-ci se produisent. N'oubliez pas non plus les occurrences de ceux qui se produisent dans des bibliothèques ou des httpModules que vous utilisez. Fondamentalement, vous souhaitez simplement ajouter le code suivant à chaque événement: xxx


4 commentaires

Nous voyions cela à .NET 4.6. Juger par Github.com/microsoft/referencesSource/blame/ Master / System.Web / ... , ceci a été corrigé dans .NET 4.7+


La description de Devid 251951 AT github.com/microsoft/referencesource/blame/master/system.web / ... ne semble pas correspondre au bogue décrit par Nenad. Je pense que le projecteur réel de la question est 289778 .


@Warlikechimpanzee Ouais, examinant cela, Devid 251951 ne résout pas le problème. Mis à jour le message pour refléter le correctif réel. Il corrige potentiellement certains cas de bogue comme un côté, effet, mais 4.7 Ajout d'un code supplémentaire dans deux endroits différents pour résoudre complètement ce bogue.


Autre bug de cookies dupliquée Description: Contexte: Application de formulaires Web (à l'aide des formulaires Authentification et URL REWRITE) Problème: Cookie de session Systématiquement envoyé deux fois (à l'exception de la première demande reçue après la compilation de l'application). Plate-forme: IIS 10 / .NET Framework 4.7.2 La solution Kevin fonctionne sur ce bogue (aussi). Remarques: Sur une page de formulaire Web ASP.NET, cette solution de contournement peut être utilisée sur l'événement de chargement. Il n'y a pas besoin de nom de cookie aléatoire.



1
votes

Autre bug de biscuits dupliquée Description:

Contexte: application Web Formulaires (à l'aide de formulaires Authentication et URL Rewrite)
Numéro: Cookie de session systématiquement envoyé deux fois (à l'exception de la première demande reçue après que l'application soit compilée).
Plate-forme: IIS 10 / .NET Framework 4.7.2

La solution Kevin fonctionne sur ce bogue (aussi).

Notes:
Il n'y a pas besoin de nom de cookie aléatoire.
Sur une page de formulaires Web ASP.NET, cette solution de contournement peut être utilisée sur l'événement Load.


0 commentaires