dans un article http://dev.mysql.com /Tech-Resources/articles/4.1/prepared-statifs.html , dit les suivantes: P>
Il existe de nombreux avantages à l'utilisation de déclarations préparées dans vos applications, à la fois pour Security Strong> em> et de performances. P>
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. P>
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. strong> EM> p> P> P> P>
Ceci est inutile lors de la gestion des déclarations préparées forte> em>. 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. P> blockQuote>
Cela signifie-t-il que je n'ai pas besoin
htmlenttities () code> ou
htmlspecialchars () code>? Mais je suppose que je dois ajouter
strip_tags () code> aux données d'entrée utilisateur? Ai-je raison? P>
5 Réponses :
Rien ne change pour Si vous utilisez des instructions préparées, vous n'avez pas besoin Si vous souhaitez vous débarrasser de htmlspecialchars () code>, 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. P>
mysql_ [real_] escape_string () code> 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). p>
HTMLSpecialchars () CODE>, 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
Les déclarations préparées sont utilisées. générer / envoyer des requêtes sur le moteur de base de données strong> fort>. p> Autoriser les deux échappement des données; Mais ils ne s'échappent pas pour le même usage. À propos de par exemple, avec cette pièce de code: p> vous 'll obtenir ce genre de sortie: p> Dans le premier cas, aucune étiquette; Dans la seconde, celles-ci correctement échappées. p> et, avec une sortie HTML: p> vous obtiendrez: p> Lequel de ceux-ci voulez-vous? que strong> est la question importante htmlentititions code>
et htmlspecialchars code>
est utilisé pour générer la sortie HTML
Donc, non, des instructions préparées (pour les requêtes SQL) em> ne vous empêchent pas d'utiliser correctement htmlspecialchars code> /
htmlenttities code> (pour la génération HTML ) EM> P>
Strip_tags CODE>: Il supprimera les étiquettes d'une chaîne, où
htmlspecialchars code> 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. p>
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.
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. P>
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. P>
Je voudrais aussi strip_tags () code> de n'importe où que vous ne voulez pas de code HTML. p>
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. P>
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. P>
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. P>
Préparer B> pour injection SQL SORTIE I>: C'est ... et redirige vers google.com p> en utilisant htmlspecialchars b>:
p> 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 P>
BlockQuote> Alors, HTMLSpecialchars de
HTMLSpecialCharlar b> pour XSS (Rediriger vers une autre liaison)
1. Utilisez HTMLSpecial pour une balise de script de désactive
2. Utilisez Préparer une base de données sécurisée P>
HTMLSpecialchars_Decode
Validation PHP P> P>
CORRECT POUR VOTRE PREMIER QUESTION ET STAND_TAGS dépend de ce que vous faites, mais ce n'est pas nécessaire non plus.