MySQL injection de la protection et de la vulnérabilité des signes à l'aide de PHP
Quels sont les meilleurs moyens de le protéger de MySQL injection? Quelles sont les faiblesses que je devrais regarder?
Je sais ce que c'est, mais je n'ai vraiment aucune idée de la manière dont je pourrais être. Si j'ai pris (ce que je pense être) des mesures visant à protéger moi et ma base de données.
Est-il un moyen infaillible de s'arrêter quelqu'un?
BTW...j'écris en PHP:)
OriginalL'auteur johnnietheblack | 2009-02-13
Vous devez vous connecter pour publier un commentaire.
Utiliser les requêtes préparées à la place du mélange de la déclaration et les données de charge utile.
voir
Vous pourriez également être intéressé par http://shiflett.org/articles/sql-injection et http://shiflett.org/blog/2007/sep/the-unexpected-sql-injection
OriginalL'auteur VolkerK
Faire confiance à personne!
Désinfecter toutes les entrées --
filter_var()
ou regexes ouin_array()
de valeurs valides ou un mélange de stratégie en fonction du type de données."Entrée" signifie n'importe quelle source d'entrée que vous ne contrôlez pas directement, pas seulement de l'formes!
Désinfecter tout ce que vous obtenez de retour de
$_GET
,$_POST
,$_SESSION
,$_COOKIE
- tout ce qui pourrait avoir une possibilité d'être souillé.ET
Utiliser les requêtes préparées
Yup. Et beaucoup de sites sont hébergés les serveurs partagés ... faire confiance à personne.
OriginalL'auteur PartialOrder
Vous devez désinfecter toutes les entrées.
Comment vous pouvez le faire dépend de la programmation languaguage et/ou de cadre vous travaillez avec.
edit:
Si vous utilisez php la fonction que vous cherchez est mysql_real_escape_string($string). Vous devez l'utiliser sur tout ce que vous recevez de la part du client qu'il faut aller dans la base de données.
N'utilisez jamais de s'échapper, à moins que vous ne peut absolument pas l'éviter. La trajectoire de fonctions peuvent être, et ont été, buggy, permettant des injections à se glisser à travers. Il est pratiquement impossible pour les DB des réalisateurs à faire une telle erreur avec des instructions paramétrées, par conséquent, ils sont plus fiables.
Cela dit, si vous DEVEZ utiliser de s'échapper (sens mysqli_* est hors de question pour quelque raison que ce soit), mysql_real_escape_string est en effet la voie à suivre.
OriginalL'auteur tliff
Si vous n'êtes pas à l'aide d'un cadre qui vous offre la désinfection des outils PHP a intégré dans la chaîne de escaper, vous devriez commencer par là. Vous pouvez trouver de la documentation sur que dans les docs PHP pour mysql véritable évasion de la chaîne. Si vous regardez l'exemple de trois, vous aurez une bonne idée des principes de base que vous pouvez suivre.
Une autre méthode que j'ai suivi est de s'assurer que je l'ai jeté variables, le cas échéant. Par exemple, si je m'attends à des commentaires d'un utilisateur à un nombre entier, je vais faire ce qui suit:
Aussi, si une colonne est censé être limité à une ou deux valeurs (par exemple une colonne de genre) assurez-vous de le faire valoir dans votre PHP avant de les mettre dans la base de données.
OriginalL'auteur Parrots
Cela peut sembler de bon sens, mais j'ai été fauché sur elle pendant un certain temps.
Il y a une différence entre encodage
htmlentities()
et échappermysql_real_escape_string()
. Je pensais d'eux comme assez interchangeables. Cependant il y a un pas... que de bon sens vous dira. 🙂 Généralement, il est préférable de les appliquer à la fois, comme la première encoder, puis s'échapper.Puis en tirant sur les données inverser le processus, ne pas encoder(si nécessaire) puis unencode. Note spécifique dans la façon dont les étapes sont effectuées (et inversé) permettra d'économiser beaucoup de maux de tête et double échappement des malheurs.
OriginalL'auteur null
Un signe que vous pourriez avoir un problème serait de prendre une entrée utilisateur directement et le mettre dans votre commande SQL.
Par exemple vous demander de leur nom d'utilisateur. Si vous le prenez et puis il suffit de dire
"Select * from Users where Username = '$USERNAME';"
L'utilisateur peut ensuite ajouter "JOE'; Drop Table..." et ainsi de suite.
En perl, vous pouvez dire quelque chose comme
La méthode execute serait pour les exploits tels que l'un au-dessus et échapper correctement.
OriginalL'auteur Rob Haupt
- Je utiliser cette fonction PHP sur toutes les entrées avant que j'essaie de l'utiliser dans n'importe quel code (requête MySQL, visualisation de données, etc.). Il n'est probablement pas complète, mais elle doit s'arrêter toutes les tentatives de piratage du système:
OriginalL'auteur Andrew Ensley