9
votes

Ai-je besoin de HTMlentties () ou de HTMLSpecialchars () dans des déclarations préparées?

dans un article http://dev.mysql.com /Tech-Resources/articles/4.1/prepared-statifs.html , dit les suivantes:

Il existe de nombreux avantages à l'utilisation de déclarations préparées dans vos applications, à la fois pour Security et de performances.

Les déclarations préparées peuvent aider à augmenter la sécurité en séparant la logique SQL des données fournies. Cette séparation de la logique et des données peut aider à prévenir un type de vulnérabilité très courant appelé une attaque d'injection SQL.

Normalement, lorsque vous avez affaire à une requête ad hoc, vous devez faire très attention lorsque vous manipulez les données que vous avez reçues de l'utilisateur. Cela implique d'utiliser des fonctions qui échappent à tous les caractères de trouble nécessaires, tels que la citation unique, la double citation et les caractères de barre oblique inverse.

Ceci est inutile lors de la gestion des déclarations préparées . La séparation des données permet à MySQL de prendre en compte automatiquement ces caractères et qu'il n'a pas besoin d'être échappé en utilisant une fonction spéciale.

Cela signifie-t-il que je n'ai pas besoin htmlenttities () ou htmlspecialchars () ? Mais je suppose que je dois ajouter strip_tags () aux données d'entrée utilisateur? Ai-je raison?


1 commentaires

CORRECT POUR VOTRE PREMIER QUESTION ET STAND_TAGS dépend de ce que vous faites, mais ce n'est pas nécessaire non plus.


5 Réponses :


9
votes

Rien ne change pour htmlspecialchars () , car c'est pour HTML, pas SQL. Vous devez toujours échapper correctement à HTML, et il est préférable de le faire lorsque vous générez en fait le code HTML, plutôt que de l'attacher à la base de données.

Si vous utilisez des instructions préparées, vous n'avez pas besoin mysql_ [real_] escape_string () plus (en supposant que vous soyez en train de vous tenir aux inscriptions de relevés préparés et à la tentation de la tentation de le contourner avec une manipulation de chaîne).

Si vous souhaitez vous débarrasser de HTMLSpecialchars () , il existe alors des moteurs de modèles HTML qui fonctionnent de manière similaire à préparé des énoncés en SQL et que vous vous libérez de tous manuellement, par exemple PHPTAL .


0 commentaires

17
votes

htmlentititions et htmlspecialchars est utilisé pour générer la sortie HTML envoyée au navigateur.

Les déclarations préparées sont utilisées. générer / envoyer des requêtes sur le moteur de base de données .

Autoriser les deux échappement des données; Mais ils ne s'échappent pas pour le même usage.
Donc, non, des instructions préparées (pour les requêtes SQL) ne vous empêchent pas d'utiliser correctement htmlspecialchars / htmlenttities (pour la génération HTML )

À propos de Strip_tags : Il supprimera les étiquettes d'une chaîne, où htmlspecialchars les transformera en entités HTML.
Ces deux fonctions ne font pas la même chose; Vous devez choisir lequel utiliser en fonction de vos besoins / ce que vous voulez obtenir.

par exemple, avec cette pièce de code: xxx

vous 'll obtenir ce genre de sortie: xxx

Dans le premier cas, aucune étiquette; Dans la seconde, celles-ci correctement échappées.

et, avec une sortie HTML: xxx

vous obtiendrez: xxx

Lequel de ceux-ci voulez-vous? que est la question importante ; -)


1 commentaires

Il convient de noter que Strip_tags ne change pas d'entités, la saisie avec des entités non valides ne sera pas corrigée et que HTML rayé à partir de balises ne sera pas un texte simple.



-2
votes

Je serais toujours enclin à encoder HTML. Si vous construisez une forme de CMS ou d'une application Web, il est plus facile de le stocker en tant que code HTML codé, puis de la ré-encoder selon les besoins.

Par exemple, lorsque vous apportez des informations dans une Textarea modifiée par TinyMCE, ils recommandent que le code HTML doit être codé - car la spécification HTML ne permet pas à HTML dans une zone de texte.

Je voudrais aussi strip_tags () de n'importe où que vous ne voulez pas de code HTML.


0 commentaires

7
votes

Vous n'avez pas besoin de HTMlenttities () ou de HTMLSpecialchars () lors de l'insertion de choses dans la base de données, rien de mal ne se produira, vous ne serez pas vulnérable à l'injection SQL si vous utilisez des déclarations préparées. La bonne chose est que vous stockerez maintenant l'entrée de l'utilisateur vierge dans votre base de données.

Vous devez échapper à des trucs sur la sortie et le renvoyer à un client, - lorsque vous tirez des choses hors de la base de données, vous serez vulnérable aux attaques de script de site interrompu et à d'autres mauvaises choses. Vous aurez besoin de les échapper pour le format de sortie dont vous avez besoin, comme HTML, vous aurez donc toujours besoin de HTMentities etc.

Pour cette raison, vous pourriez simplement échapper aux choses que vous les mettez dans la base de données, pas lorsque vous la sortiez - Cependant, vous perdrez la mise en forme d'origine de l'utilisateur et vous échapperez aux données de l'utilisation HTML qui pourrait ne pas Payer si vous utilisez les données dans différents formats de sortie.


0 commentaires

0
votes

Préparer pour injection SQL
HTMLSpecialCharlar pour XSS (Rediriger vers une autre liaison)
XXX

SORTIE : C'est ... et redirige vers google.com

en utilisant htmlspecialchars : xxx

Si l'utilisateur entrez le commentaire "The Script" dans la base de données, puis affichage du navigateur Tout commentaire de la base de données, auto "Le script" sera exécuté et Rediriger vers Google.com

Alors,
1. Utilisez HTMLSpecial pour une balise de script de désactive
2. Utilisez Préparer une base de données sécurisée

HTMLSpecialchars de
HTMLSpecialchars_Decode
Validation PHP


0 commentaires