PHP: Est mysql_real_escape_string suffisant pour le nettoyage de la saisie de l'utilisateur?
Est mysql_real_escape_string
suffisant pour le nettoyage de la saisie de l'utilisateur dans la plupart des situations?
::EDIT::
Je pense principalement en termes de prévention d'une injection SQL, mais en fin de compte je veux savoir si je peux faire confiance les données de l'utilisateur après que je demande mysql_real_escape_string ou si je doit prendre des mesures supplémentaires afin de nettoyer les données avant de me la passer autour de l'application et des bases de données.
Je vois où de nettoyage pour HTML caractères est important, mais je ne voudrais pas considérer qu'il est nécessaire de faire confiance à la saisie de l'utilisateur.
T
- XSS est un énorme problème, si vous l'ignorez, vous allez avoir des problèmes de grandeur égale. Vous devez valider sur le chemin, mais si vous n'êtes pas décapage javascript lorsque vous affichez le contenu de l'utilisateur, c'est vraiment, vraiment trivial à faire des choses comme le Détournement de Session et les attaques XSS qui est franchement, waaay plus facile à utiliser que l'injection SQL, mais est un peu plus récent, donc les gens ne comprennent pas encore.
mysql_real_escape_string
est uniquement destiné à protéger contre les injections SQL. Pour d'autres vulnérabilités, vous avez besoin d'autres outils.- mysql_real_we_really_mean_it_this_time_escape_string couvre ces cas. Lorsqu'elle est ajoutée dans un futur proche.
- hilarant, mais les couilles, pas d'une fonction peut faire tous les travaux de nettoyage.
- s'Échapper de la chaîne de caractères n'est pas sûre! En savoir sur le prêt consolidés pour MySQLi.
Vous devez vous connecter pour publier un commentaire.
mysql_real_escape_string
n'est pas suffisante dans toutes les situations, mais il est certainement très bon ami. Le mieux solution est d'utiliser Les Requêtes PréparéesAussi, de ne pas oublier HTMLPurifier qui peut être utilisé pour rejeter toute invalide/suspect caractères.
...........
Edit:
Sur la base des commentaires ci-dessous, j'ai besoin de poster ce lien (je l'ai fait avant désolé pour créer de la confusion)
mysql_real_escape_string() par rapport à des Déclarations Préparées à l'avance
De citer:
Chris Shiflett (Expert En Sécurité)
mysql_real_escape_string
a été conçu pour prendre la connexion jeu de caractères en compte, et oui, c'est sûr.addslashes()
n'est pas sûr en toutes circonstances.La réponse à votre question est Non. mysql_real_escape_string() n'est pas adapté à toutes les entrées utilisateur et mysql_real_escape_string() ne s'arrête pas toutes les sql injection. addslashes() est une autre fonction à utiliser en php, et il a le même problème.
code vulnérable:
poc exploiter:
Le patch est à utiliser des guillemets autour id:
Vraiment la meilleure approche est d'utiliser des requêtes paramétrées, dont un certain nombre de personnes avoir souligné. Aop fonctionne bien, adodb est un autre populaire de la bibliothèque pour php.
Si vous n'utiliser mysql_real_escape_string est devrait seulement être utilisé pour l'injection sql, et rien d'autre. Les vulnérabilités sont fortement tributaires de la façon dont les données sont utilisées. On devrait appliquer les mesures de sécurité sur une fonction par fonction. Et oui, XSS est une PROBLÈME TRÈS GRAVE. Pas de filtrage pour le html est une grave erreur qu'un pirate va utiliser pour pw3n vous. Veuillez lire la xss faq.
mysql_real_escape_string()
impropres à s'échapper chaînes pour SQL. Edit: Oui, les requêtes préparées sont mieux.mysql_real_escape_and_quote_string()
. Et encore, pas en soi un problème avec la fonction, mais avec ses utilisation incorrecte. Je voudrais encore voir un exemple oùmysql_real_escape_string()
est insuffisante.À la base de données, oui. Vous aurez envie de considérer adéquatement échapper /encodage des données pour la sortie ainsi.
Vous devriez également envisager de validation l'entrée à l'encontre de ce que vous attendez qu'elle soit.
Avez-vous envisagé d'utiliser les requêtes préparées? PHP offre de nombreuses façons d'interagir avec votre base de données. Dont la plupart sont mieux que les mysql_* les fonctions.
AOP, MDB2 et la MySQL Améliorée devrait vous obtenir a commencé.
Quelles situations?
Pour les requêtes SQL, c'est génial. (Les instructions préparées sont mieux je vote AOP pour cela - mais la fonction n'échappe à l'amende juste.) Pour le HTML et autres, ce n'est pas l'outil pour le travail - essayez un générique
htmlspecialchars
ou un outil plus précis comme HTML Purificateur d'.À l'adresse de modifier: Le seul autre couche vous pouvez ajouter des données est valdation, par exemple, de confirmer que si vous mettez un nombre entier dans la base de données, et vous attendez un entier positif, vous renvoyer un message d'erreur à l'utilisateur de tenter de mettre dans un entier négatif. Aussi loin que l'intégrité des données est concerné,
mysql_real_escape_string
est le meilleur que vous avez pour échapper (même si encore une fois, les requêtes préparées sont un système de filtre qui évite de s'échapper entièrement).<?php echo $_GET['name']; ?>
.mysql_real_escape_string()
est utile pour empêcher les attaques par injection SQL seulement. Il ne sera pas vous aider à la prévention de cross site scripting attaques. Pour cela, vous devez utiliserhtmlspecialchars()
juste avant la sortie des données qui ont été collectées à l'origine de la saisie de l'utilisateur.Il y a deux manières, l'une est d'utiliser les requêtes préparées (comme mentionné dans d'autres réponses), mais qui va ralentir votre application, parce que vous avez maintenant d'envoyer deux demandes à la Base de données, au lieu d'un. Si vous pouvez vivre avec la perte de rendement, alors allez-y; les Instructions Préparées rend votre code plus joli et plus facile à traiter.
Si vous avez choisi d'utiliser mysql_real_escape_string, alors assurez-vous d'échapper à toutes les chaînes qui sont non fiables. Un (mysql_real_escape_string) s'est échappé de la chaîne est d'Injection SQL sécurisé. Si vous n'avez pas à échapper à toutes les chaînes, alors vous n'êtes pas sûr. Vous devriez vraiment se combinent avec mysql_real_escape_string de validation de la saisie; vérifier qu'une variable que vous vous attendez à détenir un nombre est vraiment un certain nombre et à l'intérieur de la fourchette prévue. Rappelez-vous, ne faites jamais confiance à l'utilisateur.
Il existe différents types de "nettoyage".
mysql_real_escape_string est suffisante pour les données de base de données, mais il sera toujours évalué par le navigateur lors de l'affichage si c'est du HTML.
Pour supprimer HTML à partir de la saisie de l'utilisateur, vous pouvez utiliser strip_tags.
Je vous suggère de regarder dans l'aide de AOP au lieu de régulier MySQL trucs, comme il prend en charge les requêtes préparées, tout droit sorti de la boîte, et ceux poignée de l'échappement de données non valides pour vous.
Vous pouvez essayer les deux, comme dans
La meilleure façon de le faire serait d'utiliser Les Requêtes Préparées
Je pensais que je voudrais ajouter que PHP 5.2+ a filtre d'entrée fonctions que l'on peut désinfecter la saisie de l'utilisateur dans une variété de façons.
Voici la la saisie manuelle ainsi que d'un post de blog [par Matt Boucher] au sujet de pourquoi ils sont grands.