Parmi les options de sécurité d’ASP.NET, il en est une qui vérifie si un évènement est bien levé par un contrôle existant. Voyons comment ça fonctionne.

Premier test : on crée un bouton asp.net avec un évènement serveur associé :

<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

Voyons le HTML généré pour ce bouton:

<input type="submit" name="ctl00$MainContent$Button1" value="Faux Button" id="MainContent_Button1" />

Je décide de remettre cet input dans ma page web, pour pouvoir effectuer mes tests :

<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<input type="submit" name="ctl00$MainContent$Button1" value="Faux Button" id="MainContent_Button1" />

(Bon, d’un point de vue strictement html, ce n’est pas correct puisqu’on a 2 fois le même id, mais ce n’est pas grave, ça nous permets quand même de tester)

Vous pouvez maintenant relancer la page, et cliquer sur les 2 boutons : les 2 fonctionnent et appellent le même évènement serveur.

Second test : je masque mon bouton serveur, et je n’ai donc que l’input, qui est censé faire la même chose. Je clique dessus, et paf :

N'oubliez pas de masquer les erreurs serveurs sur vos sites web en prod

Cette fois, on a une exception. Comme je vous le disais en introduction (et comme c’est expliqué dans l’exception), asp.net vérifie que l’appel d’un évènement est bien fait pas le contrôle qui est censé le faire. Ici, le contrôle est invisible, donc il sait qu’on ne doit pas pouvoir cliquer dessus.

Comment ça fonctionne ? Si on va voir dans le code html de la page, on a ça :

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgK/nJySCALU8MqYCAhBiRxDmDNQ9n9ZcocpixkidLmpXhA4hY5aUcMhNlh9" />

La plupart des développeurs asp.net connaissent le viewstate, beaucoup moins connaissent ce champ caché nommé __EVENTVALIDATION. Comme son nom l’indique, il permets de valider les évènements. Il s’agit de données chiffrées permettant de savoir quels sont les boutons cliquables. Donc impossible pour un pirate de simuler un clic sur un bouton invisible !

Pour plus d’informations, je vous renvoie à l’article de Cyril Durand sur la validation d’évènements.

Il n’en reste pas moins que sur le fond, il ne faut pas oublier de penser à la sécurité : même si asp.net nous facilite le travail, ne déléguez jamais la sécurité ;) il ne faut surtout pas se baser sur la visibilité d’un bouton pour donner des droits d’administration, les vérifications doivent impérativement être faites au niveau métier.