Question

Je travaille actuellement sur une application nécessitant que les utilisateurs soumettent des publications et des commentaires qui sont affichés sur le site. Comme nous savons tous que les entrées des utilisateurs ne sont pas fiables, j'ai donc utilisé htmlspecialchars ($ string, ENT_QUOTES) pour traiter les publications et les commentaires des utilisateurs.

Maintenant, je veux ignorer certaines balises HTML. comme <b><br /> et quelques balises supplémentaires. Comment puis-je le faire pour que htmlspecialchars ignore certaines balises pendant qu'il filtre les autres.

Était-ce utile?

La solution

solution a)
utilisez strip_tags au lieu de htmlspecialchars et liste blanche les balises nécessaires.
meilleure solution b)
Utilisez les codes bb et attribuez des alias aux balises souhaitées, par exemple: [b] bold [/ b]

Autres conseils

Il est très, très difficile de n'autoriser que certaines balises HTML sans aucune possibilité d'injection de script ou autre.

Je recommanderais en fait d'éviter cela et d'utiliser quelque chose qui génère du HTML, tel que ce code UBB analyseur (ou similaire). Ou même Markdown (avec l'option HTML désactivée).

Cela n'autorise pas les assaillants à consulter votre site, ce qui est très important s'il est public.

Si vous autorisez même un peu de HTML, il est probable qu'un attaquant déterminé parvienne à le contourner.

Vous en avez marre d'utiliser le BBCode en raison du paysage actuel de filtres HTML déficients ou non sécurisés?
- > purificateur HTML

HTML Purifier est une bibliothèque de filtres HTML conforme aux normes et écrite en PHP. HTML Purifier ne supprimera pas seulement tout le code malveillant (mieux connu sous le nom de XSS) avec une liste blanche complètement auditée, sécurisée mais permissive, ...

Vous pouvez remplacer la chaîne entre guillemets pour réinsérer les balises autorisées. Pour les <b> balises par exemple:

$string = str_replace(array('&lt;b&gt;', &lt;/&gt;), array('<b>', '</b>'), $string);

J'autorise uniquement les balises complètes et très distinctes à être aussi sécurisées que possible. C'est à dire. N'utilisez pas d'expressions régulières si vous n'y êtes pas obligé, cela peut conduire à de très mauvais bugs.

Je vous recommande fortement d'utiliser Zend_Filter pour filtrer via l'entrée utilisateur. Plus précisément, voir: http://framework.zend.com/ manual / fr / zend.filter.html # zend.filter.introduction.using

Ce n'est pas aussi simple que vous pourriez le penser, car ni htmlspecialchars() , ni htmlentities() ne fournit aucune option permettant d'ignorer certaines balises (les deux fonctions ne connaissent même pas la signification de la notion de balises ).

Vous pouvez utiliser d'autres moyens pour permettre aux utilisateurs de formater leurs publications, par exemple. BBCode , Textile ou Markdown . Des analyseurs syntaxiques PHP sont disponibles pour tous.

Si vous devez vous en tenir aux balises HTML, vous pouvez recourir à un prétraitement qui reformate les balises autorisées afin qu'elles ne soient pas affectées par <a> . Vous pouvez ensuite post-traiter le résultat pour rétablir le format en balises HTML normales. L'exemple suivant visualise ce processus pour une simple balise <=>. Sachez que le traitement de HTML avec des expressions régulières est sujet à des erreurs et qu’il n’est pas toujours la meilleure façon de procéder. Je ne l’utiliserai que par souci de simplicité, dans cet exemple.

$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);

Ceci n’a pas été testé et demandera sûrement beaucoup plus de travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top