2010-09-04 24 views
0

Après avoir implémenté mes fonctions d'assainissement (selon les spécificités demandées), mon patron a décidé de changer l'entrée acceptée. Maintenant, il veut garder une étiquette spécifique et ses attributs. J'ai suggéré de mettre en place un langage semblable au BBCode qui est plus sûr à mon humble avis mais il ne le veut pas parce que ce serait beaucoup de travail.Nettoyage d'une chaîne HTML en enregistrant quelques balises et attributs

Cette fois, je voudrais garder les choses simples, donc je ne vais pas le tuer la prochaine fois qu'il me demande de changer à nouveau cette chose. Et je sais qu'il le fera.

Est-il suffisant d'utiliser d'abord le strip_tags avec le paramètre tag à conserver, puis htmlentities?

Répondre

2

strip_tags n'aboutit pas nécessairement à un contenu sécurisé. strip_tags suivi par htmlentities serait sûr, en ce que tout code HTML est sûr, mais cela n'a aucun sens. Soit l'utilisateur saisit du texte brut, auquel cas il doit sortir en utilisant htmlspecialchars (en préférant htmlentities), ou il saisit le balisage HTML, auquel cas vous devez l'analyser correctement, corriger le balisage cassé et supprimer des éléments/attributs qui ne figurent pas dans une liste blanche sécurisée.

Si c'est ce que vous voulez, utilisez une bibliothèque existante pour le faire (par exemple htmlpurifier). Parce que ce n'est pas une tâche triviale et si vous vous trompez, vous vous êtes donné des trous de sécurité XSS.

+0

Oui, par exemple. fonction javascript, nous serons appelés s'ils sont dans un attribut d'un tag autorisé. +1 pour le lien vers htmlpurifier. Je vais regarder. – dierre

0

Vous pouvez conserver les balises spécifiques à l'aide strip_tags avec cette syntaxe: strip_tags($text, '<p><a>');

cet extrait dépouillerait tous les tags sauf p et a. Les attributs sont conservés pour les étiquettes que vous avez autorisées (p et a dans l'exemple ci-dessus).

Toutefois, cela ne signifie pas que les attributs sont sûrs. Veut-il des attributs spécifiques ou veut-il les garder tous sur des balises autorisées? Dans le premier cas, vous devez analyser chaque étiquette et supprimer celles qui vous intéressent, en désinfectant les valeurs. Pour conserver tous les attributs sur les balises autorisées, vous devez toujours les désinfecter. Je recommande d'exécuter htmlentities sur les valeurs d'attribut pour les assainir (pour l'affichage, je suppose).

+0

Non, aucune demande particulière à propos de l'attribut à conserver. En fait, j'allais aussi utiliser 'htmlentities' pour stocker les données dans la base de données. – dierre

+1

@dierre: le codage HTML est uniquement un problème de sortie. Ne polluez pas votre base de données avec des données encodées, cela rendra difficile la recherche, l'utilisation de la manipulation de chaînes de bases de données et l'utilisation dans des contextes non HTML. HTML-encoder, en utilisant 'htmlspecialchars()', à l'étape de sortie, où vous mettez du texte en HTML, et pas avant. – bobince

+0

@dierre: n'utilisez pas 'htmlentities' pour le stockage. Utilisez 'mysql_real_escape' ou similaire. En outre, 'htmlentities' peut botcher certains attributs afin de jouer avec lui. Cependant, vous voulez toujours échapper aux attributs de sorte que certains wiseguy ne peuvent pas faire cela: ''. Je voudrais vérifier le lien @bobince fourni ci-dessous. –