Equivalence de htmlspecialchars()

Résolu/Fermé
Mouch89 Messages postés 109 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 11 avril 2013 - 29 août 2011 à 12:19
Mouch89 Messages postés 109 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 11 avril 2013 - 29 août 2011 à 22:50
Bonjour,

J'aimerais sécuriser l'affichage des entrées utilisateurs (commentaires d'articles, témoignages, envoi par messagerie interne au site, etc).

Je me suis naturellement tourné vers htmlspecialchars, mais la fonction telle qu'elle est ne me convient pas. J'aimerais quelque chose de plus propre dans l'affichage.
Limite une fonction qui supprime automatiquement les balises <qqc></qqc> m'irait. Ca existe une fonction comme ça ? Ou je dois faire la mienne ?

Et le top du top, ça serait une fonction qui me laisse les <b> et <i> !

Vous avez connaissance de fonctions de ce type ?

Merci de votre aide !

5 réponses

graffx Messages postés 6506 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 24 mars 2019 1 973
29 août 2011 à 12:31
Attendons confirmation mais je ne suis pas sur qu'il y a moyen avec une fonction php de supprimer quelque balises seulement.

Il faut tricher a mon avis, peut en faisant ton bbcode?
0
arthezius Messages postés 3538 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 475
29 août 2011 à 21:56
strip_tags()
Vous pouvez utiliser ce paramètre optionnel pour spécifier les balises qui ne doivent pas être supprimées. 

https://www.php.net/manual/fr/function.strip-tags.php
0
Mouch89 Messages postés 109 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 11 avril 2013 7
29 août 2011 à 22:02
J'ai bien vu cette fonction, mais y'a deux avertissements de sécurité pour son utilisation. Autant dire que j'accroche pas vraiment !
0
Mouch89 Messages postés 109 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 11 avril 2013 7
Modifié par Mouch89 le 29/08/2011 à 20:45
Ca parait pas très compliqué à coder, on parcourt notre chaine, et on supprime tout ce qui se trouve entre des chevrons (chevrons y compris).

Non ? Bon y'a encore quelques trucs a prévoir, mais dans l'idée c'est ça :)
0
graffx Messages postés 6506 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 24 mars 2019 1 973
29 août 2011 à 13:33
Oui tu dosi pouvoir faire comme ca je vais jeter un oeil de mon coté en attendant d'autres reponses.
0
Mouch89 Messages postés 109 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 11 avril 2013 7
Modifié par Mouch89 le 29/08/2011 à 22:25
J'ai fait un ptit truc qui vide ce qui se trouve entre des balises < et > !
Bon, y'a encore des choses à revoir ou implémenter (une liste blanche des balises à accepter) mais je pense qu'elle est opérationnelle là.

function filtrerChevrons($chaine)   
{   
 $debut = $fin = -1;   
    
 for ($i=0 ; $i<strlen($chaine) ; $i++)   
 {   
  if ($chaine[$i] == '<') $debut = $i;   
  else if ($chaine[$i] == '>') $fin = $i;   
     
  if (($debut != -1) && ($fin != -1))   
  {   
   $longueur = $fin - $debut + 1;   
      
   $chaine_buffer = substr($chaine, $debut, $longueur);   
      
   if (strpos($chaine_buffer, '/')) $remplacement = '< />';   
   else $remplacement = '< >';   
      
   $chaine = substr_replace($chaine, $remplacement, $debut, $longueur);   
      
   $debut = $fin = -1;   
  }   
 }   
 return $chaine;   
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mouch89 Messages postés 109 Date d'inscription mercredi 6 janvier 2010 Statut Membre Dernière intervention 11 avril 2013 7
Modifié par Mouch89 le 29/08/2011 à 22:50
En fait, c'est pas la solution idéale niveau sécurité (pas étonnant je dois dire :) ).

L'utilisateur peut par exemple rentrer <strong<>>texte en gras</strong</>> et la fonction fait planter le chargement de la page !

Il y a clairement un soucis avec le strlen de la chaine dans une boucle for alors que la chaine est de taille variable...

On peut régler ce soucis en donner un plafond fixe à la boucle for avec $plafond=strlen puis en utilisant $plafond dans la boucle. J'ai testé, ça résout bien ce pb mais j'ai peur qu'il y en ai beaucoup d'autres des pb !

Du coup, je vais rester sur un htmlspecialchars, tant pis si c'est moche, ou moins c'est bien securisé (je crois).
0