begin process at 2010 02 09 22:20:58
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

E-Mail / Messagerie

 > SÉCURISER ET PARSER UN MESSAGE POUR UN FORUM

SÉCURISER ET PARSER UN MESSAGE POUR UN FORUM


 Information sur la source

Note :
9,25 / 10 - par 4 personnes
9,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :E-Mail / Messagerie Niveau :Initié Date de création :03/10/2003 Vu :4 490

Auteur : olid

Ecrire un message privé
Site perso
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Pour un forum, il est nécessaire d'interdire l'utilisation de code PHP, Javascript, et de limiter les balises HTML autorisées. Il faut aussi gèrer les mots trés longs (une URL, par exemple) pour éviter qu'ils déforment la mise en page du site.

Et pour la convivialité, il faut parser (ou interpreter) les URL ou adresses e-mail pour les rendre automatiquement cliquables. Enfin, - la cerise sur le gateau -, remplacer les caractères des smileys par des images.

Dans le source ci-dessous, on part du principe que le message saisi par l'utilisateur provient d'un champ TEXTAREA qui renvoie sa valeur dans la variable '$texte'. Il suffit de sauvegarder le contenu de cette variable à la fin du traitement pour avoir la version sécurisée.

La méthode utilisée ici pour sécuriser consiste à utiliser l'instruction 'htmlentities' aprés avoir parser - temporairement - les balises HTML que l'on veut autoriser avec des '-%' ou '%-' ; elles seront re-parser juste à la fin avec des '<' ou '>' pour les réactiver. Ici, on autorise les balises <B>, <I>, <U>, et <BR>.

Puis, le traitement se fait mot-à-mot pour :
- mettre des séparations (qui seront effectives si jugées nécessaire par le navigateur) en cas de mots trés long,
- créer des liens avec les URL (commençant par http ou www),
- identifier les smileys avec prise en charge de ceux qui rigolent (ou pleurent) trop fort !!! ;op

Pour cette exemple, les smileys ne sont pas remplacés par des images, mais simplement mis en gras avec une étiquette affichant la pensée associée au smiley... Il sera pas difficile pour vous de le modifier pour l'emploie d'images.

NB: les curieux remarqueront qu'il est facile d'adapter ce source pour qu'il gère le BBCode à la place des balises HTML autorisées ;o)

Source

  • //Préformatage pour les étourdis :op
  • $texte = ucfirst($texte);
  • //Le retour chariot \r (de Windows) est implicite quand il y a un saut de ligne \n ... On les supprime !!!
  • $texte = str_replace ("\r", "", $texte);
  • //Si il y a un saut de ligne, on ferme toutes les balises (autorisées) de mise en forme.
  • $texte = str_replace ("\n", " </B></U></I><BR> ", $texte);
  • //On garde une copie de l'original
  • $texteoriginal=$texte;
  • //Suppression des caractères interdits
  • $texte = str_replace ("-%","",$texte);
  • $texte = str_replace ("%-","",$texte);
  • //Reformatage (temporaire) de la syntaxe des balises autorisées en remplacant < par -% et > par %-
  • $texte = str_replace (array ("<BR>","<br>"),"-%BR%-",$texte);
  • $texte = str_replace (array ("<B>","<b>"),"-%B%-",$texte);
  • $texte = str_replace (array ("</B>","</b>"),"-%/B%-",$texte);
  • $texte = str_replace (array ("<U>","<u>"),"-%U%-",$texte);
  • $texte = str_replace (array ("</U>","</u>"),"-%/U%-",$texte);
  • $texte = str_replace (array ("<I>","<i>"),"-%I%-",$texte);
  • $texte = str_replace (array ("</I>","</i>"),"-%/I%-",$texte);
  • //Decomposition du texte mot à mot
  • $mots = explode(" ",$texte);
  • //Boucle d'analyse de chaques mots
  • $nbmots = count($mots);
  • for ($i = 0; $i < $nbmots; $i++)
  • {
  • //Forcer les césures si un mot dépasse 50 caractères
  • $motproteger = wordwrap( $mots[$i], 50,"-%WBR%-",1);
  • //Désactive les balises HTML interdites (et autres codages Javascript, PHP, etc)
  • $motproteger = htmlentities($motproteger,ENT_QUOTES);
  • //Recherche de ce qui ressemble à un mail, une URL, ou un smileys pour transformer en lien ou image.
  • if (strpos($mots[$i],"@") > 3)
  • {
  • $mots[$i] = "<A HREF='mailto:$mots[$i]'>$motproteger</A>";
  • }
  • else if (strtolower(substr($mots[$i],0,7)) == "http://")
  • {
  • $motproteger = strtolower($motproteger);
  • if (strpos($motproteger,"?",0) > 0) $motproteger = substr($motproteger,0,strpos($motproteger,"?",0));
  • $mots[$i] = "<A HREF='$mots[$i]' TARGET=_blank>$motproteger</A>";
  • }
  • else if (strtolower(substr($mots[$i],0,4)) == "www.")
  • {
  • $motproteger = strtolower($motproteger);
  • if (strpos($motproteger,"?",0) > 0) $motproteger = substr($motproteger,0,strpos($motproteger,"?",0));
  • $mots[$i] = "<A HREF='http://$mots[$i]' TARGET=_blank>$motproteger</A>";
  • }
  • else if ((substr($mots[$i],0,4) == ":o))") AND (substr($mots[$i],-1) == ")"))
  • {
  • $mots[$i] = "<B CLASS=Smileys TITLE=\"Mort de rire\">:o))</B>";
  • }
  • else if ($mots[$i] == ":o)")
  • {
  • $mots[$i] = "<B CLASS=Smileys TITLE=\"Content(e)\">:o)</B>";
  • }
  • else if ((substr($mots[$i],0,4) == ";o))") AND (substr($mots[$i],-1) == ")"))
  • {
  • $mots[$i] = "<B CLASS=Smileys TITLE=\"Clin d\'oeil amusant\">;o))</B>";
  • }
  • else if ($mots[$i] == ";o)")
  • {
  • $mots[$i] = "<B CLASS=Smileys TITLE=\"Clin d\'oeil\">;o)</B>";
  • }
  • else if ($mots[$i] == ":op")
  • {
  • $mots[$i] = "<B CLASS=Smileys TITLE=\"Tire la langue\">:op</B>";
  • }
  • else if ($mots[$i] == ";op")
  • {
  • $mots[$i] = "<B CLASS=Smileys TITLE=\"Tire la langue et cligne de l\'oeil\">;op</B>";
  • }
  • else if ((substr($mots[$i],0,4) == ":o((") AND (substr($mots[$i],-1) == "("))
  • {
  • $mots[$i] = "<B CLASS=Smileys TITLE=\"Pleure\">:o((</B>";
  • }
  • else if ($mots[$i] == ":o(")
  • {
  • $mots[$i] = "<B CLASS=Smileys TITLE=\"Boude\">:o(</B>";
  • }
  • else if ($mots[$i] == ":o.")
  • {
  • $mots[$i] = "<B CLASS=Smileys TITLE=\"Etonné\(e\)\">:o.</B>";
  • }
  • else if ($mots[$i] == ":o|")
  • {
  • $mots[$i] = "<B CLASS=Smileys TITLE=\"Sans voix\">:o|</B>";
  • }
  • else
  • {
  • //Pour un mot banal, on utilise la version protégée sans balises HTML actives
  • $mots[$i] = $motproteger;
  • }
  • }
  • //Recolle les mots du texte
  • $texte = implode(" ",$mots);
  • //On restaure la syntaxe des balises autorisées
  • $texte = str_replace ("-%","<",$texte);
  • $texte = str_replace ("%-",">",$texte);
  • //On ajoute des anti-slash pour sauvegarder dans un champ TEXT d'une table SQL
  • //Ne pas oublier de faire un 'stripslashes' lors de la lecture du message depuis la table SQL
  • $texte = addslashes($texte);
		//Préformatage pour les étourdis :op
		$texte = ucfirst($texte);
		
		//Le retour chariot \r (de Windows) est implicite quand il y a un saut de ligne \n ... On les supprime !!!
		$texte = str_replace ("\r", "", $texte);
		
		//Si il y a un saut de ligne, on ferme toutes les balises (autorisées) de mise en forme.
		$texte = str_replace ("\n", " </B></U></I><BR> ", $texte);
		
		//On garde une copie de l'original
		$texteoriginal=$texte;
		
		//Suppression des caractères interdits 
		$texte = str_replace ("-%","",$texte);
		$texte = str_replace ("%-","",$texte);
		
		//Reformatage (temporaire) de la syntaxe des balises autorisées en remplacant < par -% et > par %-
		$texte = str_replace (array ("<BR>","<br>"),"-%BR%-",$texte);
		$texte = str_replace (array ("<B>","<b>"),"-%B%-",$texte);
		$texte = str_replace (array ("</B>","</b>"),"-%/B%-",$texte);
		$texte = str_replace (array ("<U>","<u>"),"-%U%-",$texte);
		$texte = str_replace (array ("</U>","</u>"),"-%/U%-",$texte);
		$texte = str_replace (array ("<I>","<i>"),"-%I%-",$texte);
		$texte = str_replace (array ("</I>","</i>"),"-%/I%-",$texte);
		
		//Decomposition du texte mot à mot
		$mots = explode(" ",$texte);
		
		//Boucle d'analyse de chaques mots
		$nbmots = count($mots);
		for ($i = 0; $i < $nbmots; $i++)
			{
			//Forcer les césures si un mot dépasse 50 caractères
			$motproteger = wordwrap( $mots[$i], 50,"-%WBR%-",1);
			
			//Désactive les balises HTML interdites (et autres codages Javascript, PHP, etc)
			$motproteger = htmlentities($motproteger,ENT_QUOTES);
			
			//Recherche de ce qui ressemble à un mail, une URL, ou un smileys pour transformer en lien ou image.
			if (strpos($mots[$i],"@") > 3)
				{
				$mots[$i] = "<A HREF='mailto:$mots[$i]'>$motproteger</A>";
				}
			else if (strtolower(substr($mots[$i],0,7)) == "http://")
				{
				$motproteger = strtolower($motproteger);
				if (strpos($motproteger,"?",0) > 0) $motproteger = substr($motproteger,0,strpos($motproteger,"?",0));
				$mots[$i] = "<A HREF='$mots[$i]' TARGET=_blank>$motproteger</A>";
				}
			else if (strtolower(substr($mots[$i],0,4)) == "www.")
				{
				$motproteger = strtolower($motproteger);
				if (strpos($motproteger,"?",0) > 0) $motproteger = substr($motproteger,0,strpos($motproteger,"?",0));
				$mots[$i] = "<A HREF='http://$mots[$i]' TARGET=_blank>$motproteger</A>";
				}
			else if ((substr($mots[$i],0,4) == ":o))") AND (substr($mots[$i],-1) == ")"))
				{
				$mots[$i] = "<B CLASS=Smileys TITLE=\"Mort de rire\">:o))</B>";
				}
			else if ($mots[$i] == ":o)")
				{
				$mots[$i] = "<B CLASS=Smileys TITLE=\"Content(e)\">:o)</B>";
				}
			else if ((substr($mots[$i],0,4) == ";o))") AND (substr($mots[$i],-1) == ")"))
				{
				$mots[$i] = "<B CLASS=Smileys TITLE=\"Clin d\'oeil amusant\">;o))</B>";
				}
			else if ($mots[$i] == ";o)")
				{
				$mots[$i] = "<B CLASS=Smileys TITLE=\"Clin d\'oeil\">;o)</B>";
				}
			else if ($mots[$i] == ":op")
				{
				$mots[$i] = "<B CLASS=Smileys TITLE=\"Tire la langue\">:op</B>";
				}
			else if ($mots[$i] == ";op")
				{
				$mots[$i] = "<B CLASS=Smileys TITLE=\"Tire la langue et cligne de l\'oeil\">;op</B>";
				}
			else if ((substr($mots[$i],0,4) == ":o((") AND (substr($mots[$i],-1) == "("))
				{
				$mots[$i] = "<B CLASS=Smileys TITLE=\"Pleure\">:o((</B>";
				}
			else if ($mots[$i] == ":o(")
				{
				$mots[$i] = "<B CLASS=Smileys TITLE=\"Boude\">:o(</B>";
				}
			else if ($mots[$i] == ":o.")
				{
				$mots[$i] = "<B CLASS=Smileys TITLE=\"Etonné\(e\)\">:o.</B>";
				}
			else if ($mots[$i] == ":o|")
				{
				$mots[$i] = "<B CLASS=Smileys TITLE=\"Sans voix\">:o|</B>";
				}
			else
				{
				//Pour un mot banal, on utilise la version protégée sans balises HTML actives
				$mots[$i] = $motproteger;
				}
			}
			
		//Recolle les mots du texte
		$texte = implode(" ",$mots);
		
		//On restaure la syntaxe des balises autorisées
		$texte = str_replace ("-%","<",$texte);
		$texte = str_replace ("%-",">",$texte);
		
		//On ajoute des anti-slash pour sauvegarder dans un champ TEXT d'une table SQL
		//Ne pas oublier de faire un 'stripslashes' lors de la lecture du message depuis la table SQL
		$texte = addslashes($texte);

 Conclusion

Merci de me le signaler si vous voyez une faille de sécurité dans ce système.


 Sources du même auteur

GÉNÉRER UN LOG AU FORMAT APACHE POUR FAIRE DES STATISTIQUES ...
RÉSUMER UN TEXTE SANS COUPER LES MOTS OU PHRASES
TEMPS ÉCOULÉ (DURÉE) ENTRE 2 DATES SOUS FORME LITTÉRAL NATUR...
RACCOURCIR INTELLIGEMMENT UNE URL POUR L'AFFICHAGE SUR UNE P...
AFFICHER UNE DATE-HEURE RÉCENTE DANS UN FORMAT NATUREL ET LI...

 Sources de la même categorie

Source avec Zip SCREENMAIL-SOLUTION DE CONTACT POUR WEBMASTERS par bnrj
Source avec Zip FORMULAIRE EMAIL AVEC PIECE JOINTE REPRIS DE LITTLEBUBU par cfndiaye
Source avec Zip Source avec une capture MESSAGERIE INTERNE AVEC FICHIER TEXTE par polly19
Source avec Zip FORMULAIRE EVOIE ET PLUS par florentinul
FILTRE POUR NEWSLETTERS GMAIL par durealex

Commentaires et avis

Commentaire de kimmelf2 le 06/10/2003 01:28:30

j'ai pas trop le temps de regarder en detail ton code mais

-1- le but est interressant
-2- tu explique deja bien a quoi ca sert, et ce que ca va faire
-3- tu met un max de commentaire

n'ayant pas pu regarder + que ca et tester le pgm, je ne met pas ma note en haut pour ne pas fausser la moyenne. J'estime ta source a 7/10, je preferes garder une marge vers le haut pour qd j'aurais le temps de tester ta source (i will be back !!!! :-D)

mais si ca marche nickel, ca montera a 9
comme disais un de mes profs : "20 c'est pour Dieu, 19 pour moi, les autres notes pour les eleves ....". Pour moi, c'est "10/10 c'est pour le pgm parfait" mais comme y'a toujours mieux de possible ....

Commentaire de iubito le 07/10/2003 06:39:01

là où tu peux améliorer, ce sont avec des regexp pour parser les mail ou les url en tout genre http:// https:// ftp:// ed2k:// et compagnie
fodra que je mette une source avec mes 'tits codes du genre ;-p

Commentaire de olid le 07/10/2003 12:25:45

Jy comprend rien en regex :o((((((((((((((((((

Commentaire de Dark_Genova le 15/04/2004 15:49:35

Ca s'apprend c'est comme tout, je pense qu'avec les regx tu aurais pu faire ce code de manière plus simple est extrayant des morceux de texte au lieu des mots. Autrement c'est pas mal fait, mais pour te permettre de l'améliorer je vais te dire ce que tu peux changer:
_ $texte par $_POST['texte']
_ en faire une fonction
=&gt; après je ne sais pas, je n'ai pas tout lu à la loupe.
++

Commentaire de bprod le 23/07/2004 08:59:56

Que de bonnes sources...
Merci encore !
8/10 ;)

Commentaire de supergrey le 08/05/2005 10:15:00

J'ai introduit ton code sur mon site et je crois qu'il y a un problème avec les accens on dirai que l'accens est bien transformé en &agrave; par exemple mais que le & est aussi codé donc ca devient  &amp; agrave; donc finalement ca affiche &agrave;

Commentaire de olid le 11/05/2005 19:38:18

pour supergrey:

tas ce genre deffet qd tu appliques 2 fois la cmd htmlentities sur le meme texte... Comme mon source le fait deja, tu nas po besoin de le faire (avant et/ou apres) :o|

Sinon, à la ligne cidessous:
$motproteger = htmlentities($motproteger,ENT_QUOTES);
Par:
$motproteger =striptags($motproteger);

Mais avec pour inconvenient que les codes HTML seront purement et simplement effacés au lieu d'etre désactivés :op

Commentaire de anzize le 09/06/2005 21:05:41

En tout cas, merci beaucoup !
Y a un truc que je recherchais depuis des décenies et là ! Pafff ! Mon problème est résolu !
Merci encore

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales