Bonjour à tous
Depuis quelques temps, j'essaye de mettre au point un script php me permettant de bloquer toute attaque XSS en éditant toutes les pages php d'un répertoire, en encapsulant toutes variables ou fonctions dans une fonction appliquant htmlspecialchar. Pour trouver toutes les sorties possibles à sécuriser sans rien rater et sans prendre quoi que ce soit qui ne devrait pas, j'essaye de mettre au point une REGEX me retournant tout ce qui doit être sanitariser. (Après, je ne le fais pas en full auto, le script me remonte les chaines à traiter, et je valide manuellement ou pas le remplacement.)
Jusque là ça marche plutôt bien , elle sait dans quel cas on est dans un echo ou pas, elle sait faire la différence entre ce qui est entre ' de ce qui ne l'est pas, mais mon problème viens des doubles quotes ". Entre ", les $variables sont interprétées, il faut donc les sanitariser. Mais une fois que ma regex m'a renvoyé une variable, la regex recommence juste après. Sauf que par défaut, elle se considère comme n'étant pas entre double quotes, et donc, quand elle recroisera une double quote, elle interprétera les caractères suivant avec son filtre "tout ce qui est entre double quotes"
Dans l'exemple suivant :
Le premier match me renvoie $variables, tout va bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 echo "Ceci est un texte avec des $variables qui sont $interpretes." . functionQuelconqueQuiRenvoieUneString($var) ; autreFonction(); echo "Deuxième string.";
Lorsque le deuxième match à lieu, il le fait à partir de ça :
Et plus rien ne marchera, puisqu'en rencontrant la 'première' double quote, il va chercher la suivante. Ce qui retournerai $var, au lieu de functionQuelconqueQuiRenvoieUneString($var).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 qui sont $interpretes." . functionQuelconqueQuiRenvoieUneString($var) ; autreFonction(); echo "Deuxième string.";
Je pourrai résoudre ce problème si en PCRE, on pouvait faire un lookbehind à longueur variable, mais ce n'est pas le cas.
Donc j'aimerai savoir si il existe de manière interne à PCRE, un moyen de "savoir" si l'on se trouve dans une string ou pas.
Le script tourne sous php7, mais les pages php à éditer sont ... dans un tas de versions différentes.
PS, pour ceux qui veulent la regex dans l'état actuel (en travaux) : https://regex101.com/r/fZ0fH4/1
Partager