Ruby on Rails : Sécurité des données : attention aux IDs
posté par Anthony Heukmes le 01-02-2008
Sécurité des données : attention aux IDs passés en paramètres
Cet article va peut-être paraître simpliste mais j'ai décidé de l'écrire car je suis toujours très surpris du manque d'attention à ce sujet.
Un exemple vaut mieux qu'un long discours :
Imaginons une page classique contenant un tableau qui liste des enregistrements. Pour chaque ligne j'ai un lien "Supprimer" qui permet d'effacer le tuple correspondant.
Ce lien appelle une méthode de votre controller et lui passe l'ID de l'enregistrement en paramètre (en GET ou en POST, peu importe...).
Et là, c'est toujours avec surprise que je constate que beaucoup d'applications web ne vérifient pas cet ID.
Imaginons que vous proposiez un système de messagerie interne aux membres de votre site. Chaque membre a bien sûr la possibilité de supprimer ses messages avec un lien comme décrit ci-dessus.
Mais voilà, n'importe quel individu possédant un QI au moins supérieur à celui d'une huître (ils sont peu nombreux, je vous l'accorde ;-)) pourra tenter de supprimer le message d'un autre membre
en modifiant simplement cet ID.
En appelant par exemple /message/destroy/5, 5 étant l'ID d'un message qui n'appartient pas au membre connecté.
Bon, si je parle de ce problème, c'est également, il faut l'avouer, car je trouve que Ruby on Rails (RoR) offre une solution plutôt élégante.
Chaque développeur devrait prendre l'habitude d'écrire du code comme celui-ci :
def destroy
user = User.find(session[:user_id])
user.messages.find(:all, :conditions => ["id = ?", params[:id]]).destroy
flash[:notice] = "Votre message a été supprimé avec succès!"
rescue
flash[:error] = "Erreur, ce message n'existe pas!"
end
En utilisant cette méthode, le find est exécuté directement sur la collection de messages appartenant à l'utilisateur en session.
Si un petit malin a essaié de falsifier l'ID passé en paramètre, aucun résultat ne sera trouvé, une exception sera alors jetée et elle sera interceptée par le block rescue.
Pensez à utiliser cette méthode dès que vous traitez des données propres aux utilisateurs!!
Version imprimable
Commentaires
Il n'y a actuellement aucun commentaire sur cet article!