2009-02-27 19 views
7

Un utilisateur saisira du texte dans une zone de texte. Il est ensuite inséré directement dans une base de données mySQL. J'utilise trim, htmlentities, mysql_real_escape_string et j'ai des guillemets magiques activés. Comment dois-je l'assainir lors de la sortie de ces données dans une zone de texte?Comment assainir correctement les données reçues d'une zone de texte, lors de la sortie dans la zone de texte?

Merci pour votre aide. Je n'ai jamais été trop sûr sur la bonne façon de le faire ...

+0

Je vous recommande de désactiver les guillemets magiques, cela ne causera que des problèmes plus tard. –

Répondre

14

Vous ne devriez pas utiliser htmlentities lorsque vous l'enregistrez. Vous devez utiliser htmlentities lors de l'affichage. La règle générale est de ne pas encoder/désinfecter les données tant que vous n'en avez pas besoin. Si vous faites htmlentities dessus quand vous enregistrez alors vous devez faire html_entity_decode sur le texte quand l'utilisateur veut éditer l'entrée. Donc, vous désinfectez pour ce dont vous avez besoin et rien de plus. Lorsque vous l'enregistrez, vous devez désinfecter pour l'injection SQL, alors vous mysql_real_escape_string. Lors de l'affichage, vous devez désinfecter pour XSS, de sorte que vous htmlentities il.

Aussi, je ne suis pas sûr si vous avez vu le commentaire de Darryl Hein, mais vous ne voulez vraiment pas que magic_quotes soit activé. They are a bad, bad, thing et ont été dépréciée à partir de PHP 5.3 et sera allé tout à fait en PHP 6.

+0

Est-ce que ce devrait être la seule précaution que je prends? –

+0

Si vous n'acceptez pas le HTML dans n'importe quelle chaîne, c'est tout. Si vous voulez que le HTML soit autorisé, alors vous descendez une route très dangereuse de listes blanches et autres joyeusetés. –

+0

Juste une note de côté, est-ce vrai pour l'analyse syntaxique BBCode? –

2

En plus de la réponse de Paolo quand utiliser htmlentities(), à moins que vous utilisez une ancienne version de PHP, la bonne façon de désinfecter pour l'insertion dans une base de données mysql est d'utiliser Prepared Statements qui font partie du mysqli extension. Cela remplace tout besoin d'utiliser mysql_real_escape_string().

À part ça, je pense que vous avez tout compris.

+1

Notez que l'utilisation d'instructions préparées n'est pas suffisante, vous devez utiliser des paramètres liés. IOW: utilisez '?' dans la chaîne SQL, et envoyer les données avec stmt-> bind_param() – Javier

+0

Dans les flux de travail normaux, ne voudriez-vous pas attraper le texte invalide avant d'atteindre l'instruction de préparation? Dans quel cas, ne convient-il pas d'utiliser mysql_real_escape_string – AlxVallejo