[Javascript] Regex

Fermé
heavymac Messages postés 11 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 29 novembre 2006 - 28 nov. 2006 à 15:17
 slooptoo - 29 nov. 2006 à 12:24
Je suis actuellement en train de coder des Regex en Javascript pour la sécurité des formulaires de mon site car j'utilise AJAX pour les traiter (XMLHttpRequest) et je voudrais donc faire le ménage avant au niveau du texte.

Je me suis penché sur la question des balises (HTML, BBCode, etc.) et de l'éventuel parsage qui va avec (ex. pour le BBCode) et, après réflexion, je me suis dis que le plus simple était encore de faire une white list, i.e. limiter les balises HTML utilisables dans les formulaires.

Je souhaite donc restreindre les balises HTML utilisables aux balises "b", "u", "i" et "code" (une balise faisant plus d'un caractère).

En fait, je voudrais faire exactement comme pour ce site qui utilise des balises personnalisées : "gras", "souligne", etc. et arriver à éliminer toutes les balises HTML sauf les balises de ma white list.

N'étant pas un expert, je suis arrivé à la Regex suivante mais elle ne marche que pour une seule balise de ma white list :

/</?[^b][^>]*>/gi
Cette Regex supprime toutes les balises HTML sauf les balises "b" (j'ai pe pas fais tous les cas possibles mais ça semble bien marcher)

Ma question est donc la suivante : quelle est la Regex me permettant de supprimer toutes les balises HTML (ie. texte compris entre < et >) sauf les balises de ma white list (balises simples, ie sans arguments, du type "b", "u", "i" ou "code" dans un premier temps)

Merci

4 réponses

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659
28 nov. 2006 à 15:26
Mais il y a plus simple:

Quand tu reçois le contenu d'un champ de l'utilisateur, tu échappe les caractères HTML.
(La plupart des langages possèdent cette fonction).

Exemple:
< sera transformé en & lt;
& sera transformé en & amp;
etc.

Comme ça, aucun moyen s'utiliser la moindre balise HTML.
Mais au moins ça permettra à ceux qui participent au forum de parler de code HTML sans se faire censurer..
0
heavymac Messages postés 11 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 29 novembre 2006
28 nov. 2006 à 15:40
Comme ça, aucun moyen s'utiliser la moindre balise HTML.

>> S'il est vrai que le but de ma Regex est ne pas pouvoir utiliser de balises HTML, n'oublie pas que je veux tout de même permettre l'usage de certaines d'entre elles !

Mais au moins ça permettra à ceux qui participent au forum de parler de code HTML sans se faire censurer.

>> Ce n'est pas particulièrement pour un site de programmation et donc je ne vois pas l'utilité de pouvoir "parler" de code HTML.

En fait, je veux faire exactement la même chose que sur ce site : éliminer toutes les balises HTML sauf certaines balises qui sont également délimitées avec < et >
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659
28 nov. 2006 à 15:49
Dans ce cas, tu peux faire une regexp de remplacement avec une callback
(La fonction est appellée pour chaque occurence de la chaîne, et c'est la fonction qui fourni la chaîne de remplacement).

C'est plus souple.

ça permet de l'exprimer plus facilement dans ta fonction.

(Je ne me rappelle plus de la syntaxe).


Hé... une minute. Tu parles de Javascript ?
Rassures-moi: Tu t'assure bien aussi côté serveur qu'il ne reste aucune balise HTML, hein ?
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
28 nov. 2006 à 17:42
Salut.

Je suis globalement d'accord avec sebsauvage.

Surtout :
Hé... une minute. Tu parles de Javascript ?
Rassures-moi: Tu t'assure bien aussi côté serveur qu'il ne reste aucune balise HTML, hein ?

Il y a mille moyens de contourner JS et un formulaire ;)

Sinon, je te suggère une solution qui me parait simple :
(a faire sur le seveur)
-un htmlentities ou htmlspecialchars (voir php les ressemblances a ne pas confondre pour choisir).
-tu remplaces les balises spécifiques au bbcode ou a ton code :
$message=preg_replace('#<(b|gras)>(.+)</\1>#U','<b>$2</b>',$message);

-Tu remplaces les balises autorisées :
$message=preg_replace('#<(a|div|etc...)>(.+)</\1>#sU','<$1>$2</$1>',$message);


C'est vria qu'on pourrait quand même avoir besoin d'un preg_replace_callback (ce que cite sebsauvage) pour vérifier qu'il n'y pas n'importe quels attributs (je pense a onclik, et tout ce que l'on peut faire en JS)


a plus
0
heavymac Messages postés 11 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 29 novembre 2006
29 nov. 2006 à 11:16
Hé... une minute. Tu parles de Javascript ?
Rassures-moi: Tu t'assure bien aussi côté serveur qu'il ne reste aucune balise HTML, hein ?
Il y a mille moyens de contourner JS et un formulaire ;)


Je sais bien que le JS présente un certain nombre de failles mais, à partir du moment où tu vires toutes les balises HTML (dont la balise "script") niveau client... et que tu fais effectivement un autre check niveau serveur, je pense que le risque est quand même limité non ?

En fait, je voudrais juste savoir s'il y a moyen de parvenir à mes fins via une seule Regex en Javascript ou s'il faut obligatoirement que je contourne le problème via le genre de solution que tu m'as proposée.

Car quand tu me dis que faire :
$message=preg_replace('#<(b|gras)>(.+)</\1>#U','<b>$2</b>',$message);
Je vois mal comment tu fais pour virer (avant ou après) toutes les autres balises HTML (ie non autorisées) de ton texte... puisque tu ne te retrouves qu'avec des balises HTML, ie balise entre < et >.

En fait, ta solution va bien dans le cas d'un parser BBCode par exemple (remplacer des balises personnalisées par des balises HTML) mais ce n'est pas ce que je veux (ne garder que certaines balises HTML)... d'autant que je connais déjà les Regex et que j'avais déjà écarté ta solution.

Je n'aurais pas posé la question si j'avais voulu faire un simple parser... chose que je sais déjà faire depuis longtemps.

C'est pour ça que j'aurais aimé trouvé une Regex qui me supprime toutes les balises HTML non autorisées (et leur contenu) pour ne pas avoir à me trouver avec un mélange de balises entre < et >

Un truc du genre :
/</?[^b][^>]*>/gi
mais qui marche avec toutes les balises autorisées.

Comme ça tu te retrouves avec un texte propre direct...

Donc existe t-il ce genre de Regex en Javascript car en php, suffirait d'utiliser la fonction strip_tags() avec en 2nd paramètre les balises à ne pas supprimer.
0
pas simple a faire vu que les expressions regulieres n aiment pas trop la logique negative
il y a une solution peu elegante cependant si vraiment vraiment tu veux le faire :
str.replace(/<(\/?([bui]|code))>/gi, "glop{$1}").replace(/<\/?[^>]+>/gi, "").replace(/glop{([^}]+)}/gi, "<$1>")
tu auras compris le principe... si l utilsateur commence a mettre du glop{} dans son texte ca ne marchera pas
0