Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Validation d'evenement en ASP.net 2.0 - EventValidation

ASP.net 2.0 propose un mécanisme de validation d'événement, cette validation permet de s'assurer que le PostBack soit bien voulu et non une tentative de piratage.

Par exemple le GridView fait plusieurs type de PostBack, en effet il nous est possible de sélectionner, éditer ou supprimer une ligne. En interne, les liens d'actions (edit, delete & co) exécutent la fonction __doPostBack avec différents arguments, le premier argument correspond à l'uniqueID du GridView et le second à l'argument de l'action, celui ci est composé du nom de l'action et du numéro de ligne séparé par un "$" . Par exemple le lien de l'action edit est "javascript:__doPostBack('gv1','Edit$1')".

Dans certains cas il nous arrive de nous abonner à l'événement rowDeleted sans toutefois rendre visible le lien dans le gridview. C'est généralement le cas dans les pages où les utilisateurs classiques ne peuvent pas supprimer une ligne alors que les admins le peuvent.

Que se passe t'il si l'on effectue manuellement ce PostBack en exécutant la fonction __doPostBack('gv1', 'Delete$1') ? Si vous avez correctement travaillé il n'y aura pas de surprise puisque vous vérifiez le rôle de l'utilisateur dans l'événement rowDeleted ! NON ?!? C'est là que la validation d'événement entre en action, en effet si vous tentez de lancer manuellement le PostBack de suppression vous aurez droit à cette erreur :

Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Dans certains cas on a quand même envie de pouvoir faire ce genre de bidouille. Tout est expliqué dans le message d'erreur, vous pouvez définir la propriété enableEventValidation de la directive Page à false ce qui désactivera la validation d'événement au niveau de la page, vous pouvez aussi le faire pour tous le site via le web.config grâce à l'attribut EnableEventValidation de la balise page. Je vous le déconseille fortement, si cet erreur survient il faut comprendre pourquoi et remédier à cela autrement qu'en supprimant les sécurités ...

Vous avez maintenant envie d'utiliser la validation d'événements dans vos propres contrôles ? Rien de plus simple ! Il vous faut utiliser la méthode GetPostBackEventReference, qui, comme tout développeur de WebControl le sait, permet de récupérer le code JavaScript à exécuter pour lancer le postback. 

Page.ClientScript.GetPostBackEventReference (Control control, String argument, Boolean RegisterForEventValidation)

Le dernier argument de cette méthode permet d'enregistrer l'événement pour validation.

Après avoir enregistré notre contrôle pour la validation d'événement il nous reste à le valider lors de la méthode RaisePostBackEvent qui est automatiquement appelé lorsque le contrôle effectue le PostBack. Pour cela il nous faut faire appel à la méthode ValidateEvent qui lancera une exception si l'eventArgument n'a pas été préalablement enregistré.

En interne ces valeurs sont stocké dans le champ caché d'id __EVENTVALIDATION :

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWCAL/+YCgCgL8kfvQDALsmvPJAgLs54QnAuya98kCAuznkMoIAuyay8kCAuznrP0C8NM4/VSobiCfASam7m9pvUjW4DA=" />

Si l'on regarde la méthode RaisePostBackEvent du gridview voici à quoi elle ressemble :

protected virtual void RaisePostBackEvent(string eventArgument) { base.ValidateEvent(this.UniqueID, eventArgument); int num1 = eventArgument.IndexOf('$'); if (num1 >= 0) { CommandEventArgs args1 = new CommandEventArgs(eventArgument.Substring(0, num1), eventArgument.Substring(num1 + 1)); GridViewCommandEventArgs args2 = new GridViewCommandEventArgs(null, this, args1); this.HandleEvent(args2, false, string.Empty); } }

Vous savez donc maintenant comment fonctionne la validation d'événement et connaissez les risques que cela entraine si vous souhaiter quand même la désactiver.

Posted: mardi 9 janvier 2007 00:21 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

arasium a dit :

Ce post est impeccable pour comprendre comment fonctionne la validation. Par contre j'aimerai savoir s'il existe déja des mécanismes tout prêt pour la validation d'evennement avec Ajax. Je m'explique, si on à une gridView qui contient des bouton de suppression (genre une corbeille à droite de cahque ligne) cela pose un problème. Lorsque l'on rajoute une ligne dans la grid et que l'on clique sur le bouton de suppression une erreur de validation est levée car à cause de l'ajax, les bouton de cette ligne ne sont pas enregistré pour la validation.

Cdt

# mai 5, 2008 17:00

arasium a dit :

Je retire ce que j'ai dit, il s'agit il me semble d'une erreur de ma part lorsque je bind les données (je les Bind dans le Load de mon UserControl or cela provoque une rreur de validation pour la GridView)

# mai 6, 2008 11:24

cyril a dit :

Je viens de vérifier, et ASP.net ajax gère correctement la validation d'évenement, à chaque asyncpostback il renvoit le champ __EVENTVALIDATION.

# mai 6, 2008 11:31
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [PowerShell 3] Télécharger et installer la documentation en ligne par Blog de SPBrouillet (Pierrick BROUILLET) le il y a 18 heures et 38 minutes

- [#SharePoint 2010][#SQLServer 2012] AlwaysOn pour SharePoint (1/4) : Configuration (1ère partie)… par Le blog de Patrick [MVP SharePoint] le 05-16-2012, 12:10

- Job Day @MIC Brussels - .Net Developers on Mobile applications par Le Blog (Vert) d'Arnaud JUND le 05-15-2012, 20:26

- [SharePoint 2010] – SharePoint 2010, Windows (Server) 8 et des erreurs IIS sont dans une VM… par Blog de SPBrouillet (Pierrick BROUILLET) le 05-14-2012, 12:10

- [Event] Windows Azure dev Camp le 20 juin! par Fathi Bellahcene le 05-13-2012, 09:29

- Comment redimensionner une image avec WinRT : plusieurs solutions par Richard Clark le 05-11-2012, 15:43

- Event : Swiss SharePoint Club Meeting #20 à Yverdon par Blog Technique de Romelard Fabrice le 05-11-2012, 15:24

- Réflechissons un peu ce matin à propos des ORM par Richard Clark le 05-11-2012, 08:48

- #SharePoint Solutions Roadshow le 5 juin à Issy ! par Le blog de Patrick [MVP SharePoint] le 05-09-2012, 15:10

- SharePoint : Mes alertes ne marchent pas … Que faire ? Comment réparer ou agir ? par The Mit's Blog le 05-08-2012, 14:59