Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Amélioration de la fonction textout()
Et7f3 Hors ligne Membre Points: 176 Défis: 1 Message

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...


Lephenixnoir En ligne Administrateur Points: 24677 Défis: 170 Message

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).
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Et7f3 Hors ligne Membre Points: 176 Défis: 1 Message

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 :


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 :
Cliquez pour découvrir
Cliquez pour recouvrir







Ajouté le 23/06/2017 à 16:20 :
Une barre de progression.
Progress
   50%


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 :

"l'impossible n'est pas français", Je suis français je suis donc capable de tout.
Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 23/06/2017 18:31 | #


Mouais
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir En ligne Administrateur Points: 24677 Défis: 170 Message

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 ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Et7f3 Hors ligne Membre Points: 176 Défis: 1 Message

Citer : Posté le 02/07/2017 18:43 | #


Je viens de le commenter pour plus de lisibilité. Je le réactive.

"l'impossible n'est pas français", Je suis français je suis donc capable de tout.

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 144 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd