Comment prévenir MySQL sommeil injections?
Récemment, un hacker essayé de ralentir mon site en utilisant le sommeil de l'injection. Bien que nous soyons à l'aide de précautions comme mysql_real_escape_string()
pour couvrir la plupart de ces entrées. Nous sommes en train de id du produit à travers la chaîne de requête et il rend la commande comme:
$id = mysql_real_escape_string($_REQUEST['id']);
$qry = "Select * from products where id = ".$id;
mais hacker essayé de fournir des commentaires comme
?id=3 and sleep(4)
et de la requête devient
Select * from products where id = 3 and sleep(4);
Bien qu'il existe quelques solutions comme
- Vérifier si l'id de produit est numérique ou pas
- Supprimer mot de sommeil de l'entrée à l'aide de quelques personnalisé en fonction
Est-il une autre méthode pour arrêter cela? Quelle est la meilleure méthode pour empêcher le sommeil des injections?
- Savez-vous que
mysql_
fonctions sont obsolètes et vous ne devriez pas les utiliser? - Paramètre de liaison permet d'éviter ce
- utilisation mysqli_ au lieu mysql_
- Aye, regardez les instructions préparées non seulement à empêcher le sommeil de l'injection " (que je n'ai pas entendu parler), bur tous les types d'injection SQL.
- +1 Meilleure question, j'ai lu aujourd'hui.
- C'est un vieux site web et l'utilisation 5.3. Je pense que les fonctions mysql_ a été abandonné dans les dernières versions seulement
- La Grande Évasion (Ou: Ce que Vous Devez Savoir Pour Travailler Avec du Texte Dans le Texte)
- Certains des gens de répondre à cette question sont tellement polarisé, c'est incroyable. Je suggère fortement à quiconque se soucier de param filtrage et AOP de lire ce thread sur le sujet qui semble plus raisonnable et rationnelle—point de vue sur cette question.
- double possible de Comment prévenir l'injection SQL en PHP?
- En fait, l'attaquant ne peuvent pas voulu ralentir votre site web, mais lire tout le contenu de votre base de données à l'aide d'une fonction du temps à l'aveugle de la requête d'attaque. Le truc, c'est qu'il peut essayer de deviner octet par octet, en utilisant quelque chose comme ET <à titre de comparaison> == "UN" ET le SOMMEIL(5) - si la page met +5 secondes, puis la première hypothèse était VRAIE. Il est incroyable de voir comment l'ensemble de la base de données peut être lu comme ça (même si lent).
Vous devez vous connecter pour publier un commentaire.
Vous n'échappent pas correctement.
mysql_real_escape_string
est pour échapper à SQL chaîne syntaxe correctement, mais vous êtes tout simplement l'intégration de la valeur nue de la valeur, non pas comme une chaîne SQL. Vous avez besoin de:Notez les guillemets autour de l'id dans la requête.
Si l'id est numérique mais, casting pour un certain nombre serait plus judicieux:
mysql_real_escape_string
.mysql_*
fonctions sont obsolètes et ne doivent pas être utilisés plus.La meilleure méthode pour empêcher les injections SQL est d'utiliser la technologie actuelle. MySQL
mysql_
famille de fonctions est obsolète et sera supprimée à partir de PHP dans une future révision.Vous devez utiliser des requêtes préparées avec MySQLi ou PDO à la place.
Ces technologies utilisent des déclarations préparées à l'avance et les requêtes paramétrées. Les instructions SQL sont analysés par le serveur de base de données séparément de tous les paramètres. Il est impossible pour un attaquant d'injecter du SQL malveillant.
En gros, vous avez deux options pour y parvenir:
MySQLi:
AOP:
Ce qui se passe, c'est que l'instruction SQL que vous passez à
prepare
est analysé et compilé par le serveur de base de données. En spécifiant des paramètres (soit un?
ou un paramètre nommé comme:name
) vous dites que le moteur de base de données que vous souhaitez filtrer. Ensuite, lorsque vous appelezexecute
l'instruction préparée est combiné avec les valeurs des paramètres que vous spécifiez.La chose importante ici est que les valeurs des paramètres sont combinés avec l'compilé déclaration, pas une chaîne SQL. SQL injection fonctionne en incitant le script dans malveillants, y compris les chaînes lorsqu'il crée SQL afin de les envoyer à la base de données. Envoyer le réel SQL séparément à partir des paramètres vous limitez le risque de se retrouver avec quelque chose que vous n'avez pas l'intention. Tous les paramètres que vous envoyez lorsque vous utilisez une instruction préparée va juste être traitées comme des chaînes (bien que le moteur de base de données peut faire quelques optimisation des paramètres peut finir comme les numéros de trop, bien sûr).
$_REQUEST['id']
comme une première couche de protection contre les params d'être passé?C'est la mauvaise question à poser.
"Comment prévenir les injections mysql?" il doit être. Dormir ou ne pas dormir - il n'a pas d'importance.
Et il y a beaucoup de réponses sur cette question déjà
vous devez convertir vos requêtes dans "préparées" à l'aide de PDO ou mysqli.