web-dev-qa-db-fra.com

CodeIgniter - pourquoi utiliser xss_clean

si je nettoie mes insertions de base de données et échappe également au HTML que j'écris avec htmlentities($text, ENT_COMPAT, 'UTF-8') - est-il utile de filtrer également les entrées avec xss_clean? Quels autres avantages apporte-t-il?

26
Dan Searle

xss_clean () est vaste et aussi idiot. 90% de cette fonction ne fait rien pour empêcher xss. Tels que la recherche du mot alert mais pas document.cookie. Aucun pirate informatique n'utilisera alert dans son exploit, il va détourner le cookie avec xss ou lire un jeton CSRF pour créer un XHR.

Cependant, l'exécution de htmlentities() ou htmlspecialchars() avec elle est redondante. Un cas où xss_clean() résout le problème et htmlentities($text, ENT_COMPAT, 'UTF-8') échoue est le suivant:

<?php
print "<img src='$var'>";
?>

Un poc simple est:

http: //localhost/xss.php? var = http: //domain/some_image.gif '% 20onload = alert (/ xss /)

Cela ajoutera le gestionnaire d'événements onload= À la balise d'image. Une méthode pour arrêter cette forme de xss est htmlspecialchars($var,ENT_QUOTES); ou dans ce cas xss_clean() empêchera également cela.

Cependant, en citant la documentation de xss_clean ():

Rien n'est jamais infaillible à 100%, bien sûr, mais je n'ai rien pu faire passer le filtre.

Cela étant dit, XSS est un output problem pas un input problem. Par exemple, cette fonction ne peut pas tenir compte du fait que la variable se trouve déjà dans une balise <script> Ou un gestionnaire d'événements. Cela n'arrête pas non plus XSS basé sur DOM. Vous devez prendre en compte comment vous utilisez les données afin d'utiliser la meilleure fonction. Filtrer toutes les données en entrée est une mauvaise pratique . Non seulement il n'est pas sûr, mais il corrompt également les données, ce qui peut rendre les comparaisons difficiles.

46
rook

Dans votre cas, "les méthodes plus strictes sont fines et plus légères" . Les développeurs de CodeIgniter prévoient xss_clean () pour un cas d'utilisation différent, "un système de commentaires ou un forum qui autorise des balises HTML" sûres "". Cela n'est pas clair dans la documentation, où xss_clean est affiché appliqué à un champ de nom d'utilisateur.

Il y a une autre raison de ne jamais utiliser xss_clean (), qui n'a pas été mise en évidence sur stackoverflow jusqu'à présent. xss_clean () a été interrompu pendant 2011 et 2012 , et il est impossible de le réparer complètement. Du moins sans refonte complète, ce qui ne s'est pas produit. Pour le moment, il est toujours vulnérable à des chaînes comme celle-ci:

<a href="j&#x26;#x41;vascript:alert%252831337%2529">Hello</a>

L'implémentation actuelle de xss_clean () commence en appliquant efficacement urldecode () et html_entity_decode () à la chaîne entière. Ceci est nécessaire pour qu'il puisse utiliser une vérification naïve pour des choses comme "javascript:". À la fin, il retourne la chaîne décodée .

Un attaquant peut simplement encoder son exploit deux fois. Il sera décodé une fois par xss_clean (), et passera aussi propre. Vous avez alors un exploit codé individuellement, prêt à être exécuté dans le navigateur.

J'appelle ces contrôles "naïfs" et non corrigibles car ils dépendent largement des expressions régulières. HTML n'est pas un langage standard. Vous avez besoin d'un analyseur plus puissant pour correspondre à celui du navigateur ; xss_clean () n'a rien de tel. Il est peut-être possible de mettre sur liste blanche un sous-ensemble de HTML, qui lexe proprement avec des expressions régulières. Cependant, le xss_clean () actuel est vraiment une liste noire.

6
sourcejedi

Je recommanderais d'utiliser http://htmlpurifier.org/ pour faire la purification XSS. Je travaille sur l'extension de ma classe d'entrée CodeIgniter pour commencer à l'utiliser.

3
Anthony

Oui, vous devriez toujours l'utiliser, je fais généralement une règle de l'utiliser au moins sur entrée publique , ce qui signifie toute entrée accessible à tous et soumettre à.

Généralement, le nettoyage de l'entrée pour les requêtes de base de données semble être un effet secondaire, car le véritable objectif de la fonction est d'empêcher Cross-site Scripting Attacks .

Je ne vais pas entrer dans les moindres détails de chaque étape que prend xss_clean, mais je vais vous dire que cela fait plus que les quelques étapes que vous avez mentionnées, j'ai pastied la source de la fonction xss_clean afin que vous puissiez vous regarder, il est entièrement commenté.

2
jondavidjohn

Si vous souhaitez que le filtre s'exécute automatiquement chaque fois qu'il rencontre des données POST ou COOKIE, vous pouvez l'activer en ouvrant votre fichier application/config/config.php et en définissant ceci: $ config ['global_xss_filtering' ] = TRUE;

Vous pouvez activer la protection csrf en ouvrant votre fichier application/config/config.php et en définissant ceci: $ config ['csrf_protection'] = TRUE;

pour plus de détails, veuillez consulter le lien suivant.

https://ellislab.com/codeigniter/user-guide/libraries/security.html

0
shankar kumar