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

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01