CodeIgniter - pourquoi utiliser xss_clean
si je suis désinfection ma DB insère, et aussi échapper à l'HTML, j'ai écris avec htmlentities($text, ENT_COMPAT, 'UTF-8')
- il y a tout point de également le filtrage des entrées avec xss_clean? Quels sont les autres avantages donne-t-il?
htmlentities($text, ENT_COMPAT, 'UTF-8')
n'est pas un bon moyen d'arrêter les attaques de type xss, il n'est pas l'utilisation de ce.htmlentities
est absolument étanche à l'HTML-injection, bien queENT_QUOTES
est nécessaire, au lieu deENT_COMPAT
si jamais vous utilisez l'apostrophe attribut délimiteurs.htmlspecialchars
est généralement préférable à lahtmlentities
, bien que, comme il a moins de chance de gâcher le jeu de caractères. CodeIgniter estxss_clean
est une valeur de la cargaison-culte de la programmation de la zone de la catastrophe plein de faire fausse route malentendus de ce qui constitue la chaîne de manutention.
Vous devez vous connecter pour publier un commentaire.
xss_clean() est vaste, et aussi stupide. 90% de cette fonction ne fait rien pour empêcher les attaques de type xss. Comme à la recherche pour le mot
alert
mais pasdocument.cookie
. Aucun pirate ne va utiliseralert
dans leur exploit, ils vont détourner le cookie avec xss ou lire un jeton CSRF pour faire un XHR.Cependant l'exécution de
htmlentities()
ouhtmlspecialchars()
avec il est redondant. Un cas oùxss_clean()
résout le problème ethtmlentities($text, ENT_COMPAT, 'UTF-8')
échoue est la suivante:Un simple poc est:
Cela va ajouter de la
onload=
gestionnaire d'événement pour la balise d'image. Un moyen d'arrêter cette forme de xss esthtmlspecialchars($var,ENT_QUOTES);
ou dans ce casxss_clean()
permettra également d'éviter cela.Toutefois, en citant le xss_clean() documentation:
Cela étant dit, XSS est une
output problem
pas uninput problem
. Par exemple, cette fonction ne peut pas prendre en compte le fait que la variable est déjà à l'intérieur d'un<script>
balise ou un gestionnaire d'événement. Il également ne pas arrêter DOM Basé XSS. Vous avez besoin de prendre en considération la façon dont vous utilisez les données afin d'utiliser la meilleure fonction. Le filtrage de toutes les données d'entrée est un mauvaise pratique. Non seulement est-il incertain mais il corrompt également des données qui peuvent rendre difficiles les comparaisons.xss_clean()
pouvez jamais être une approche fiable pour résoudre les problèmes XSS (etxss_clean()
lui-même est un laughably terrible de la mise en œuvre même par le bas, du bas niveau de l'anti-XSS outils). Je suis très surpris que vous semblez être une adoption comme une alternative préférable à la sortie au niveau échapper dans votre première phrase.alert()
mais pasdocument.cookie
. Mais plus tard, dans mon post j'ai dit que xss est une sortie de problème, et qu'il n'y a qu'une seule façon que je sais d'où xss est possible. Mais je vais mettre à jour ce post.xss_clean
ne semblent chercherdocument.cookie
... même si évidemment, ce n'est encore complètement inutile que ça ne marcherait pasdocument . cookie
,document['cookie']
ou l'une des milliers d'autres façons de se référer à elle.Dans votre cas, "plus strictes méthodes sont beaux, et les plus légers". CodeIgniter les développeurs ont l'intention xss_clean() pour les différents cas d'utilisation, "un système de commentaires ou le forum qui permet de" sûr "balises HTML". Ce n'est pas clair à partir de la documentation, où xss_clean est montré appliqué à un champ nom d'utilisateur.
Il y a une autre raison de ne jamais utiliser xss_clean(), qui n'a pas été mis en évidence sur stackoverflow jusqu'à présent. xss_clean() a été interrompue pendant Deux mille onze et Deux mille douze, et il est impossible de résoudre complètement. Au moins sans une refonte complète, ce qui n'est pas arrivé. Pour le moment, c'est toujours vulnérable à des chaînes de caractères comme ceci:
La mise en œuvre actuelle de xss_clean() commence par appliquer efficacement les urldecode() et html_entity_decode() pour l'ensemble de la chaîne. Ceci est nécessaire afin de pouvoir utiliser l'un naïf vérifier pour des choses comme le "javascript:". À la fin, il retourne la chaîne décodée.
Un attaquant peut simplement encoder leur exploit à deux reprises. Il sera décodé une fois par xss_clean(), et passer aussi propre. Vous disposez ensuite d'un seul codé exploiter, prêtes pour l'exécution dans le navigateur.
J'appelle ces contrôles "naïve" et irrécupérable parce qu'ils sont largement tributaire des expressions régulières. HTML n'est pas un langage régulier. Vous avez besoin d'un plus puissant analyseur pour correspondre à celui dans le navigateur; xss_clean() n'a pas quelque chose comme ça. C'est peut-être possible de la liste blanche d'un sous-ensemble du langage HTML, qui lexes proprement avec des expressions régulières. Cependant, le courant xss_clean() est très bien une liste noire.
Je vous conseille d'utiliser http://htmlpurifier.org/ pour faire XSS purification. Je suis en train de travailler sur l'extension de mon CodeIgniter d'Entrée de la classe de tirer parti de cela.
Oui, vous devriez toujours être en l'utilisant, en général, je faire une règle pour l'utiliser au moins sur face au public, entrée, sens de l'entrée que tout le monde peut accéder et de se soumettre.
Généralement désinfection à l'entrée pour les requêtes DB semble comme un effet secondaire que le vrai but de la fonction est d'empêcher Le Cross-site Scripting Attaques.
Je ne vais pas entrer dans les détails concrets de chaque étape xss_clean prend, mais je vais vous dire, il fait plus que les quelques étapes que vous avez mentionné, j'ai pastied la source de la xss_clean fonction de sorte que vous pouvez regarder vous-même, il est entièrement commenté.
Si vous voulez que le filtre à exécuter automatiquement à chaque fois qu'il rencontre la POSTE ou données COOKIES, vous pouvez l'activer par l'ouverture de votre application/config/config.php fichier et le réglage de ce paramètre:
$config['global_xss_filtering'] = TRUE;
Vous pouvez activer la protection csrf par l'ouverture de votre application/config/config.php fichier et le réglage de ce paramètre:
$config['csrf_protection'] = TRUE;
pour plus de détails, veuillez consulter le lien suivant.
https://ellislab.com/codeigniter/user-guide/libraries/security.html
global_xss_filtering
maintenant. Voir: codeigniter.com/user_guide/libraries/input.html "Le" global_xss_filtering’ paramètre est OBSOLÈTE et conservée uniquement pour compatibilité ascendante fins. XSS échappement doivent être effectuées sur la sortie, pas d'entrée!"