Amélioration de la fonction textout()
Posté le 20/06/2017 14:31
Bonjour tout le monde,
Comme vous le savez, le lorsque vous envoyez du texte sur le site, le contenu est protégé et le BBcode est transformé en HTML :
[b]gras[/b] en
<strong>gras</strong>, par exemple.
J'ai la charge de proposer une nouvelle version de cette fonction : c'est le moment pour vous de suggérer de nouvelles balises.
Avancement de la fonction
J'ai publié la v1 (qui est en fait la v2). Si vous voulez la tester, rendez-vous sur
cette page et insérez votre BBcode à traduire après le
text=.
Les futures versions seront disponibles à la même URL (je changerai juste le fichier
main.php).
Voir le code
Si voulez voir le code rajouté un s au fichier ainsi
main.php devient
main.phps
Fonctions à ajouter
– Listes
– Détections d'URL
– 6 petits détails
Cette liste pourra s'allonger avec vos demandes et idées.
Description des paramètres
Le prototype de la fonction est le suivant :
function textesortie($t, $echo = true, $setChoisi = 'forum');
– Le premier paramètre et le BBcode à traduire.
– Le deuxième paramètre permet d'appeler
echo dès que la traduction est terminée, faisant de ces deux appels la même chose :
echo textsortie("coucou");
textesortie("coucou", true);
* Le troisième paramètre est un ensemble de balise (ce sont des clef de l'array
$ensemble).
$ensemble possède les clefs
"special" ,
"init",
"forum",
"shout" et
"all".
– Toutes les fonctions de l'array
init sont appelées automatiquement à l'initialisation : elles reçoivent comme seul argument le texte entier (très utile pour les alias et la censure). On pourrait imaginer la même chose pour les optimisations de fin, ie. une clef
end.
–
special regroupe des fonctions qui ont un prototype spécifique (elles sont utilisées en interne).
Les tableaux suivants seuls peuvent être modifiés :
–
forum : Les balises du forum.
–
shout: Les balises de la shoutbox.
–
all: Un fallback.
Le prototype des fonctions qu'ils contiennent est le suivant :
function ($contenu, $arg = '', $debug = 0)
–
$contenu est le texte entre les deux balises ;
–
$arg est le texte éventuel placé après le
= dans la balise ouvrante
–
$debug est utilisé pour du debuggage (sans blague) de la fonction dans son ensemble.
Description du fonctionnement
Lorsqu'on appelle la fonction
textesortie(), celle-ci appelle toutes les fonctions du tableau
init puis utilise une regex pour capturer un nœud :
#(?P<avant>[^\[]*)(?P<btag>\[(?P<balise>\w+)(?:=(?P<argument>[^\]]*))?\])(?=(?R)?.*?\[\/\k{balise}\])(?P<contenu>(?R)?.*?)(?P<etag>\[\/\k{balise}\])#
Cette regex (un peu compliquée) capture
[balise] si et seulement si il existe un
[/balise] plus loin et si le contenu délimité valide aussi la regex (d'où le
(?R)?), donnant ainsi la plus longue de ces paires.
Si on n'obtient aucun match, alors on on échappe le texte avec
htmlentities().
Sinon, on regarde si la balise existe dans notre ensemble, et à défaut dans le groupe
all (qui remplit ainsi sont rôle de fallback). Si la balise n'existe pas du tout, on la réassemble avec une fonction du groupe
special qui se nomme
undefined().
Dans le cas d'une capture, on envoie le texte avant le nœud à
textesortie(), on appelle la fonction associée à la balise si elle existe, et on envoie également le texte après le nœud à
textesortie().
Protection des données
L'objectif de cette amélioration est de se débarrasser de toutes les XSS et les injections CSS. C'est pourquoi dès que
textesortie() ne capture pas de balise, elle échappe avec
htmlentities() ; de plus, chaque balise doit vérifier son contenu (ou déléguer la vérification en rappelant
textesortie(), comme le fait la balise
[b]).
'b' => function ($contenu, $arg = '', $debug = 0) {
return '<strong>'.textesortie($contenu, $debug).'</strong>';
}
J'ai donc testé chaque balise avec les injections suivantes :
Injection 1: "><script>alert(1);</script>
Injection 2: <script>alert(1);</script>
Aucun JavaScript n'a été exécuté. C'est pour ça que vous verrez beaucoup de JavaScript sur la page de la fonction.
Easter eggs
Puisqu'évidemment il en faut, j'en ai mis.
– Si on tente d'injecter du JavaScript dans une image, image aléatoire apparaît.
– Si on tente d'injecter du JavaScript dans une URL, on se fait rediriger vers
http://exemple.com.
– J'ai dû en oublié un...
Citer : Posté le 20/06/2017 15:12 | #
Pas la peine de changer les fontes, celle par défaut est très bien. Le code inline avec la backtick est très utile, il serait peut-être bien de l'ajouter. Bon point d'avoir pensé aux listes, on en manque.
Je serais très curieux de voir ta détection des urls. Pour avoir trempé dans le bordel, je suis bien placé pour savoir à quel point c'est tordu. Par extension, la structure du convertisseur m'intéresse aussi (s'il faut remplacer le code de Cake en prod' il vaudrait mieux que le nouveau soit au moins aussi maintenable que l'ancien).
Citer : Posté le 20/06/2017 23:17 | #
Tu juges la balise [font] inutile? Bah, à vrai dire ça doit être comme la
balise vidéo(on me siffle a oreillette qu'elle est utilisée), vraiment pas utilisée.Je rajouterai les backticks.Ajouté le 21/06/2017 à 14:11 :
Voilà mon sujet de test pour la détection d'URLs :
http://foo.com/blah_blah/
http://foo.com/blah_blah_(wikipedia)
http://foo.com/blah_blah_(wikipedia)_(again)
http://www.example.com/wpstyle/?p=364
https://www.example.com/foo/?bar=baz&inga=42&quux
http://✪df.ws/123
:8080">http://userid::8080
:8080/">http://userid::8080/
">http://
/">http:///
:8080">http://:8080
:8080/">http://:8080/
">http://userid:
/">http://userid:/
http://142.42.1.1/
http://142.42.1.1:8080/
http://➡.ws/䨹
http://⌘.ws
http://⌘.ws/
http://foo.com/blah_(wikipedia)#cite-1
http://foo.com/blah_(wikipedia)_blah#cite-1
http://foo.com/unicode_(✪)_in_parens
http://foo.com/(something)?after=parens
http://☺.damowmow.com/
http://code.google.com/events/#&product=browser
http://j.mp
ftp://foo.bar/baz
http://foo.bar/?q=Test%20URL-encoded%20stuff
http://مثال.إختبار
http://例子.测试
http://उदाहरण.परीक्षा
http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com
http://1337.net
http://a.b-c.de
http://223.255.255.254
Ajouté le 22/06/2017 à 10:38 :
Bon, Cakeisalie5 a eu accès au code donc je partage le lien :
http://travail.byethost12.com/?text=(votre texte)
Merci à Cakeisalie5 qui a relevé un problème que je risque d'avoir. J'ai donc déplacé mon code ici :
(ancienne version) http://travail.byethost12.com/index2.php?text=
Je rajouterai le mode d'emploi ici après avoir réécrit la fonction principale.
Ajouté le 23/06/2017 à 15:49 :
Quelques tests avec les images et leur dimensionnement :
Ajouté le 23/06/2017 à 16:20 :
Une barre de progression.
Ajouté le 23/06/2017 à 16:28 :
Je fais le spoiler, et il ne me restera plus que les listes, les vidéos et les smileys.
Avec une injection dans une image pour la route :
Citer : Posté le 23/06/2017 18:31 | #
Mouais
Citer : Posté le 02/07/2017 18:42 | #
J'ai mis encore plus en forme ce post et corrigé de nombreuses fautes. Ça s'améliore, mais pense à toujours systématiquement faire des phrases complètes.
Du coup ça m'a l'air déjà un peu plus clair et argumenté. Par contre la page du code n'a plus l'air de permettre les tests par GET ?
Citer : Posté le 02/07/2017 18:43 | #
Je viens de le commenter pour plus de lisibilité. Je le réactive.