2010-06-11 5 views
7

Je me demande s'il n'y a aucun inconvénient ou une mauvaise pratique en faisant la procédure suivante:htmlentities PHP() sur l'entrée avant insertion de DB, au lieu de la sortie

  1. user_input $ -> htmlentities (de user_input de $) -> mysql_escape (user_input de $) -> insérer user_input $ dans DB
  2. Sélectionnez user_input $ de DB -> echo $ user_input

au lieu de faire ce qui suit:

  1. user_input $ -> mysql_escape (de user_input de $) -> insérer user_input $ dans DB
  2. Sélectionnez user_input $ de DB -> echo htmlentities (user_input de $)

Comme nous affichons le même user_input de $ sur un terrain des endroits où il se sent plus efficace faire sur l'entrée à la place, y a-t-il des inconvénients/mauvaises pratiques/exploitabilité de le faire de cette façon?

À la votre!

bonnes réponses à la question de:

: En général @ Matt, pour garder les choses lisible et maintenable, essayez de le stocker au plus près du contenu original, non filtrée que possible. Cela dépend de deux choses: Est-ce que d'autres personnes/programmes vont référencer ces données? Les données doivent-elles être facilement modifiables?

@Sjoerd: Il existe un inconvénient si vous souhaitez afficher les données sous un autre format que HTML, par ex. un téléchargement CSV, PDF, etc.

Répondre

3

Cela dépend de deux choses:

  • est toute autre personne/programme va faire référence à ces données?
  • Les données doivent-elles être facilement modifiables?

L'avantage d'une méthode est que, dans le cas où les données sont utilisées dans un endroit et htmlentities() serait appelé à chaque fois, vous seriez sauver cette étape. Cependant, cela ne laisserait une amélioration notable que si les données HTML sont très volumineuses. En général, pour que les choses restent lisibles et maintenables, essayez de les stocker aussi près que possible du contenu original non filtré. En fait, vous pourriez trouver que HTML n'est pas la bonne chose à stocker quand même. Il pourrait être préférable de stocker quelque chose comme Markdown et simplement le convertir en HTML lorsqu'il est visionné.

+0

Merci, pour cette application spécifique les données sont des commentaires sur les produits, à savoir les évaluations des utilisateurs dans une boutique et je veux protéger contre les attaques XSS. Donc l'évitement des attaques XSS est l'objet ici. – grandnasty

+0

Est-ce que d'autres personnes/programmes vont référencer ces données? - Non pour le moment, mais peut-être plus tard via les API. Les données doivent-elles être facilement modifiables? - Les utilisateurs devraient être en mesure d'éditer leurs commentaires – grandnasty

+0

@samuelf - Je vous suggère de stocker le HTML tel quel (même si vous avez encore besoin de 'mysql_escape' pour éviter les injections SQL). L'appel de 'htmlentities' à la demande ne devrait pas avoir un impact important. – Matt

1

Il y a un inconvénient si vous voulez afficher les données comme autre chose que HTML, par ex. téléchargement CSV, PDF, etc.

+0

Vrai que, à moins que le PDF est fait via wkhtmltopdf etc. – grandnasty

3

Je vous déconseille. Si vous avez besoin de ces données pour autre chose que de les afficher au format HTML (afficher dans la console, envoyer un e-mail texte, écrire dans un journal, etc.), vous devrez le reconvertir.

Une bonne pratique consiste à appliquer ces transformations uniquement au dernier moment.Utilisez mysql_escape avant de l'insérer dans la base de données, utilisez htmlentities (ou htmlspecialchars) avant de l'afficher en HTML. De cette façon, vous savez toujours où vos fonctions d'échappement devraient être. S'ils ne sont pas là, vous pouvez facilement dire que vous faites quelque chose de mal. Vous savez également que les données de la base de données sont toujours propres et que vous n'avez pas besoin de vous souvenir si vous les avez encodées, avec quoi et comment les réactiver.

Questions connexes