Break your xss breach bitch ! [EDIT du 30 septembre]

Tous ceux qui ont le triste privilège de relire mes snipètes vous le diront, à force de ne coder que pour mon usage personnel, je n'ai pas appris à me méfier des utilisations malhonnêtes des sites et la faille XSS est en quelque sorte devenue ma marque de fabrique (spécial wink to JérômeJ entre autres ).

Ce désolant constat posé, j'ai commencé un travail sur moi-même et m'efforce de sécuriser les choses les plus évidentes à coup de htmlentities ou hmltspecialchars ...

Toutefois, et afin de tempérer le légitime engouement pour ces fonctions, il faut bien reconnaître que parfois, on veut bien sécuriser mais on aimerait tout de même conserver le balisage html, ou alors, on aimerait bien qu'en cas de balisage (volontaire ou pas) on ne se retrouve pas avec un texte tout moche qui apparaisse AVEC les balises html pour cause d'entités...

 


Je vous propose une petite fonction, à améliorer sans doute, qui permettra:

  • de sécuriser une chaine,
  • de sécuriser un tableau, même multidimensionnel,
  • de préciser le résultat que vous souhaitez obtenir

 


Il suffit d'appeler la fonction secure pour virer ce qui peut s'avérer dangereux. Le second argument de cette fonction spécifie le niveau d'agressivité de la suppression: 

  • 0 (valeur par défaut) : elle vire tout balisage par un strip_tags et ne retrourne que le texte brut, ce qui est utile pour éviter de voir apparaître le balisage dans un titre ou un bouton par exemple...
  • 1 : seuls les balises script et javascript: ainsi que les js attachés aux évènements onclick etc sont supprimés... On conserve donc le balisage html normal.
  • 2: on sécurise par un htmlspecialchars, ce qui aura pour effet collatéral de laisser apparaître les tags html.

 

En conclusion, je préciserais tout de même que le paramètre 1 de cette fonction ne protègera pas d'un code malicieux inline implanté dans un évènement, comme par exemple:

echo secure('<a href="http://warriordudimanche.net/test.htm" onclick="alert(\'\')">yo!</a>',1);

Il faudra, pour être sûr de soi, mettre 0 ou 2 à la place du 1.

Désormais, cette fonction supprime directement le code inline en même temps que les balises <script> et javascipt: .


 

 

 

 

Attends, c'est quand même pas TOI qui vas nous filer des trucs contre les failles XSS, si ?!

 

 

 

 

 

Ce qui m'étonne le plus, pour ma part, c'est que tu saches épeler XSS... 

 

 

 

 

 

Allez, ramasse tes dents et ton air con pis barre-toi. 

 

 

❝ 9 commentaires ❞

1  Walane le

Il te faudrait aussi un indenteur/formatter histoire d'avoir quelque chose de lisible :D

" else if (is_string($var)){
if ($level==0) {$var=strip_tags($var);}
else if ($level==1) {$var=str_replace(array('<script>','</script>','javascript:'),array('<script>','</script>','javascript:'),$var);}
else {$var=htmlspecialchars($var);}"

 
2  JeromeJ le

T'façon, le PHP étant tout pourrite (oui oui), voilà mon résumé:

- Utiliser htmlspecialchars et non htmlentities (c'est pour les vieux singes qui ne sont pas encore à l'UTF-8, la honte !)

- Réimplémenter soit-même htmlspecialchars (ce qui est assez simple, confer intra) car, parfois, on ne sait toujours pas pourquoi (on a eu le prob sur Googol), htmlspecialchars s'amuse à nous renvoyer silencieusement une chaîne toute vide. Merci PHP :D

function my_htmlspecialchars($str)
{
return str_replace(array('&', '<', '>', '"'), array('&quot;', '&lt;', '&gt;', '&quot;'), $str);
}

Mon conseil, même si ce n'est pas mainstream, serait de protéger systématiquement $_GET et $_POST (ça règle pas mal de soucis / oublis) mais garder la version complète (avec HTML potentiel) dans un tableau à part ($_GET_HTML et $_POST_HTML par exemple) ce qui permet de quand même y accéder quand vous êtes sûr de ce que vous faites ;)

SINON, BRONCO, VIS À VIS DE TA FONCTION :)

L'idée est bonne mais encore un ptit peu à perfectionner.
- Les balises HTML sont insensible à la casse je crois. Donc je peux toujours mettre <SCRIPT> que ta fonction n'y verrait que du feu :p (str_ireplace ou preg_replace avec l'option i)
- Mon commentaire à propos de htmlspecialchars
- En plus tu dis toi même que ta fonction n'est pas parfaite :p (je te taquine, tu sais bien)
- En général, mais ça ça ne regarde que moi, j'suis plutôt contre l'utilisation de strip tags, je suppose que si qqn à utiliser des balises HTML là où il n'y avait pas droit, c'est qu'il voulait qu'elle s'affiche :p

Pour finir et pour te quoter un ptit peu (quelque chose que t'as mis sur Googol auquel je modif juste la fin):

"Sinon, utilisez un vrai langage"

*tousse tousse* Python *tousse*

 
3  JeromeJ le

La semaine prochaine, vous découvrirez Bronco entrain de faire connaissance avec les failles de types CRSS the hard way !

(Quid des injections SQL ? :p)

T'es le meilleur !

 
4  Bronco le

Hinhin... les injections SQL connaît pas (j'aime pas les databases )

Ceci dit, c'est vrai pour la casse... je corrigerai ça !

Où t'en es de la petite appli python que je t'ai proposée
tsstss de toutes façons, ya rien comme le visual basic

VB POWAAAA

 
5  JeromeJ le

@Bronco: On en parlera + sur le salon shaarli si tu veux :p

J'suis fort busy mais j'ai beaucoup chipoté, j'aime beaucoup le défi lancé même si, après réflexion, je pense que ça serait sûrement beaucoup plus simple de partir avec une disposition clavier personnalisée :) (facile, portable, …)

Tandis que bon, VB c'était pas un truc windows only ça ? :p
En Python, faut télécharger plein de libs pour pouvoir interagir avec cet OS super fermé qu'est Windows (Windows API, etc). Je chercherais encore mais c'est un peu plus hard que prévu à cause de ça :o (rien que de trouver les lib externes qui permettrait de faire ça simplement), dès que j'ai le temps aussi :p

 
6  Bronco le

hinhinhin, oui...
De toutes façons, vu les efforts de la NSA pour surveiller tous les logiciels/systèmes/machines (voir http://sebsauvage.net/links/?FZvDyA ) je pense que je vais passer définitivement à Linux... et encore faudra-t-il trouver une distrib 100% non américaine ou alors revenir à un bon vieux xp plus mis à jour, ça restera moins dangereux que 8 pourri ou seven mis à jour avec leur mouchard.

Sinon, pour la disposition clavier, ce n'est pas une bonne idée quand tu bosses sur trois ou quatre machines différentes, comme un prof le fait souvent: maison fixe+maison laptop+boulot sa salle+boulot salle des profs par exemple...

 
7  JeromeJ le

@Bronco: Mais si justement :D

pierreghz m'a reforwardé un programme génial que j'avais oublié qui permet de changer de disposition clavier peu importe sur quel PC tu es simplement en branchant une clé USB et ça ne nécessite pas les droits administrateurs, pas d'installation, …

http://sourceforge.net/projects/pkl/ (il m'semble que c'est que pour Windows mais je crois que Linux offre beaucoup plus de choix et de flexibilité donc ça sera sûrement beaucoup plus simple dans ce sens que dans l'autre :))


À propos de la NSA, d'pire en pire, moi je devrais également définitivement quitter Windows :// crotte. Je le quitterais avec joie mais la question est de trouver quelque chose d'user friendly et potable à côté.

 
8  JeromeJ le

Allez on y est presque !

" ?" est mal :)

Faudrait tester mais que se passe-t-il si je met deux espaces ? ou un autre type d'espace blanc ?

\s* serait mieux (d'une part \s est "censé" capturé tous les espaces blancs ... censé et * permet d'en avoir N au lieu de juste 0 ou 1)

Secondo, tu n'imagines pas à quel point l'HTML peu être mal formé et toujours fonctionner x)

Parfois certains omettent les "" (et j'ignore dans quel condition ça fonctionne mais je sais que parfois c'est le cas :p), pour </?script> je doute que ça soit suffisant :(

À vérifier mais moi j'irais jusqu'à mettre <\s*/?\s*script\s*> (de plus je crois qu'ils pourraient très bien omettre de fermer la balise :D niark niark (pareil avec onQuelqueChose)).

J'sais pas :p Est-ce que je t'ai déjà dit que je trouvais que ton idée partait sûrement d'une bonne intention mais me semblait un peu foireuse ? :3 <3

Captcha: nuoc !!

 
9  Bronco le

En fait, j'ai plus besoin de me faire chmir à ajouter mon duo de cowboys en fin d'article: il suffit d'attendre que tu commentes pour avoir quelqu'un qui me poignarde l'oignon
Quand j'aurai minutes, je reverrai la regex en ce sens

 

Fil RSS des commentaires de cet article

✍ Écrire un commentaire

Quelle est la première lettre du mot ssicu ?