Lors de la conversion d’une longue liste de mots surveillés en expressions régulières, j’ai découvert des moyens de contourner les filtres. Ces méthodes semblent fonctionner à la fois pour les mots surveillés « normaux » et pour les expressions régulières.
Espaces doubles : si votre mot surveillé est forbidden word, il est possible de le contourner en insérant plusieurs espaces entre les deux mots. Fait amusant : dans le message rendu, les doubles espaces sont supprimés, ce qui les rend totalement invisibles dans le texte final.
Pour éviter cela avec des expressions régulières : utilisez forbidden\s*word.
Pour éviter cela sans expressions régulières : je n’ai pas trouvé de solution.
Utilisez des tirets bas pour contourner les limites de mots :
Sans regex : si vous entourez un mot surveillé de tirets bas, il sera affiché en italique et sera autorisé. Ainsi, _forbidden_ sera accepté si votre filtre est forbidden.
Avec des regex : normalement, les limites de mots ne sont vérifiées que si vous utilisez \b, auquel cas le tiret bas les contourne. Ainsi, _forbidden_ sera accepté si votre filtre est \bforbidden\b.
Pour éviter cela avec des expressions régulières : utilisez [\b\_] au lieu de \b. MODIF : cela ne semble pas fonctionner correctement.
Supprimer les limites de mots pourrait aussi fonctionner, mais vous risquez alors d’interdire accidentellement des mots comme cumulative ou title
Pour éviter cela sans expressions régulières : je n’ai pas trouvé de solution.
Bon, c’est généralement le genre de chose pour laquelle nous ne perdons pas de temps à nous battre, car il existe de nombreux « astuces » ingénieuses pour contourner n’importe quelle liste de mots interdits. Unicode est un espace très vaste.
En effet, nous avons essayé de faire cela sur plusieurs grands projets éducatifs il y a quelque temps.
Avant qu’il ne soit abandonné, ils ont lancé la correspondance floue, ce qui a prévisiblement causé toutes sortes de problèmes pour des cas d’utilisation légitimes.
Les mots surveillés constituent surtout une « première ligne de défense » contre les mots interdits. Vous avez toujours besoin de la communauté pour signaler les contournements et les violations.
Aucune expression rationnelle que vous puissiez concevoir ne pourra détecter une .
Juste pour vous informer, [] sert à définir des « classes de caractères ». Dans les expressions régulières Perl, et probablement Ruby, \b représente une « frontière de mot » en dehors d’une classe de caractères et un « retour arrière » à l’intérieur d’une classe de caractères. En C, ‘\b’ est toujours un retour arrière (plus précisément le caractère de contrôle H). Le retour arrière n’est généralement pas un caractère utile, contrairement aux frontières de mots, d’où cette redéfinition.
Pour utiliser une expression régulière afin de détecter « interdit » ou « interdit », je utiliserais probablement :
\b_?interdit_?\b
(Je sais également comment encoder tous mes caractères en utilisant des entités HTML comme _ pour éviter les astuces Unicode ou les problèmes liés aux expressions régulières.)