Empêcher les failles XSS ou Cross Site Scripting en PHP grâce à une fonction antixss
En 2007 j’avais trouvé sur le blog de l’excellent Korben un petite fonction pour empêcher les failles XSS ou Cross Site Scripting en PHP.
Hélas, depuis le temps, cette fonction comporte toujours une petite erreur (la fonction strip_tags renvoie une valeur de retour) qui n’a toujours pas été corrigée depuis. Ca fait jamais que 9 ans à l’heure ou j’écris ces lignes 😉
Voici donc la même fonction, légèrement corrigée.
function antixss($input) {
$new=strip_tags($input);
$new = htmlspecialchars($new, ENT_QUOTES);
return $new;
}
Et pour l’utiliser, voici un exemple avec le paramètre « name » passé avec la methode GET
$value = antixss($_GET["name"]);
ou la méthode POST
$value = antixss($_POST["name"]);
Petite explication pour ceux qui ignorent ce qu’est une faille XSS ou Cross Site Scripting: Il s’agit d’un méthode très utilisée par les hackers qui consiste simplement à faire exécuter du code dans une page web en l’injectant dans un formulaire ou une url.
Un exemple simple pour comprendre:
Admettons que vous ayez un formulaire sur votre site, par exemple un formulaire de contact. Si vous faites en sorte que le contenu des champs du formulaire s’affiche sur la page lors de sa validation (par exemple pour en confirmer les informations), et qu’un petit malin met du code javascript genre
<script>alert('coucou')</script>
Une fenêtre « Coucou » va s’afficher à l’écran!
Cet exemple est inoffensif, mais un hacker un peu chevronné peut facilement pirater une base de données grâce à cette méthode…
Alors protégez-vous bien!
bonjour, il y a une erreur dans le code de la fonction, voila la correction :
function antixss($input) {
$new = strip_tags($input);
$new = htmlspecialchars($new, ENT_QUOTES);
return $new;
}
et si on veut faire plus compact et plus optimisé en mémoire :
function antixss($input) {
return htmlspecialchars(strip_tags($input), ENT_QUOTES);
}
C’est exact, petite inversion de variables (ou de lignes) qui fait que forcement, ça marchait pas 🙂
Merci pour votre vigilance.