Tu devrais commencer par lire attentivement la documentation du module CGI (qui est la bonne façon de faire du CGI en Perl aujourd'hui, tiens toi à bonne distance de tout script qui utiliserait encore cgi-lib ou autre horreur des temps antiques...) et de DBI (particulièrement la partie sur les placeholders, qui t'éviteront toute injection SQL) ainsi que la section de la doc sur le mode tainted.
En général, et surtout si tu utilises le mode tainted, Perl est bien plus résistant aux attaques que ses concurrents (je pense surtout à PHP ici, qui est une vraie passoire), sa mauvaise réputation vient surtout du temps où d'innombrables programmeurs d'un jour se "créaient" "leur" page CGI en collant ensemble des bouts de code divers trouvés sur la toile et utilisant l'antique cgi-lib. Le plus important c'est de toujours rester prudent par rapport à son code.
Je vais te donner un petit exemple débile des failles qu'on peut trouver sur le web : imaginons un site web qui offre des statistiques sur par exemple des courses de chevaux. Il récupère les résultats bruts sous forme de fichiers CSV et il a un petit programme "stats" qui appliqué à un fichier d'une course crée un fichier de statistiques. Par paresse le formulaire du site web qui permet de choisir la course dont on veut consulter les statistiques n'offre pas une liste déroulante de choix mais juste un champ de texte dans lequel on entre le nom de la course.
Au final, dans son script CGI, on trouve l'instruction suivante :
system("stats $course_name.csv >$course_name.st");
... (et là normalement tu pousses des cris d'horreur, sinon c'est que soit tu ne t'y connais pas bien du tout en Perl/PHP/Bash, soit tu dois redoubler de prudence parce que tu es susceptible aux erreurs classiques)
Parce que si l'utilisateur malveillant s'avise par exemple d'écrire plutôt :
"chambond; rm -rf . #" dans son champ de texte, le webmaster n'aura plus que ses yeux pour pleurer...
Bon cet exemple particulier est impossible en Perl avec le mode tainté (ou du moins très difficile, il faut y mettre une mauvaise volonté particulière) et de toute façon on espère bien que ton serveur est sur une machine Unix/Linux bien configurée de sorte que la commande en question n'ai pas d'effets, néanmoins, il s'agit d'un exemple typique des erreurs qu'on peut rencontrer tous les jours sur le net (parfois de façon plus subtile, mais pas toujours).
--
Jedaï
Partager