Salut all,
Je me pose la question si l'utilisation de requete prepare empeche/parre toutes injections SQL ?
(par prepare j'entends $mysqli->prepare ou mysqli_prepare)
Merci pour vos infos.
Salut all,
Je me pose la question si l'utilisation de requete prepare empeche/parre toutes injections SQL ?
(par prepare j'entends $mysqli->prepare ou mysqli_prepare)
Merci pour vos infos.
Que les neurones soient avec toi, jeune padawan.
Ne pas oublier, qu'un métier, développer être.
Effectuer des recherches et lire les tutos, avant de poster, tu dois.
Aucune question technique, faites par MP, tu ne dois.
Ce n'est pas la fonction prepare() en elle même qui empêche les injections, c'est le fait de ne pas mettre les données potentiellement dangereuse dans la requête mais de les passer en paramètre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part mysqli_prepare('SELECT colonne FROM table WHERE colonne = ' . $_POST['id']); // pas bien
N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP
Merci sabotage pour ta reponse, mais je parlais dans des conditions correctes d'utilisation
(genre l'exemple http://php.net/manual/fr/mysqli.prepare.php)
Donc si on fait comme l'exemple, ca empeche les injections ?
Que les neurones soient avec toi, jeune padawan.
Ne pas oublier, qu'un métier, développer être.
Effectuer des recherches et lire les tutos, avant de poster, tu dois.
Aucune question technique, faites par MP, tu ne dois.
Avec Mysql, il vaut mieux aussi desactiver l'emulation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP
Bonjour,
il serait bon de lire la doc :
Si j'ai tout compris (lol)
Pas glop, car utilisation du $_POST['id'] directement dans le prepare.
Code : Sélectionner tout - Visualiser dans une fenêtre à part mysqli_prepare('SELECT colonne FROM table WHERE colonne = ' . $_POST['id']);
Glop, car le $_POST['id'] est en dehors de la cmd sql.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mysqli_prepare('SELECT colonne FROM table WHERE colonne = ?'); $con->bind_param('i', $_POST['id']);
Que les neurones soient avec toi, jeune padawan.
Ne pas oublier, qu'un métier, développer être.
Effectuer des recherches et lire les tutos, avant de poster, tu dois.
Aucune question technique, faites par MP, tu ne dois.
D'accord, c'est affirmatif :
Mais pas très explicite pour autant.. Si votre application utilise exclusivement les requêtes préparées, vous pouvez être sûr qu'aucune injection SQL n'est possibl
Réceptionnons une variable pirate $_GET['cadeau']="DELETE 'everything' FROM 'la_totale' ".
Pourquoi le fait d'utiliser une requête préparée neutralise-t'il la valeur piégée de la variable $_GET['cadeau'] ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $stmt = $dbh->prepare ("INSERT INTO REGISTRY (cadeau) VALUES (:cadeau, :value)"); $stmt->bindParam(':cadeau', $_GET['cadeau']);
Je ne me représente pas le truc.
Essaye, pour voir...
Bah, ce n'est pas de constater le résultat qui va m'expliquer le mécanisme qui produit ce résultat
T'sais pas en fait
Ca ME suffit comme explication.Si votre application utilise exclusivement les requêtes préparées, vous pouvez être sûr qu'aucune injection SQL n'est possible
« Prévenir les injections requiert de séparer les données non sûres des commandes et requêtes. »
Et ça tombe bien ; c'est très précisément ce que font les requêtes préparées : séparer les données de la structure de la requête !
Dernière modification par Invité ; 21/04/2017 à 16h30.
[troll on]
Trop fort le pifou
[troll off]
Que les neurones soient avec toi, jeune padawan.
Ne pas oublier, qu'un métier, développer être.
Effectuer des recherches et lire les tutos, avant de poster, tu dois.
Aucune question technique, faites par MP, tu ne dois.
D'accord, ça me rassure.
Mais ne me satisfait point pour autant.
Bon alors, pour la science, quel genre de spécialité informatique faut-il pratiquer, pour être capable de répondre à la question susdite ? Est-ce du ressort exclusif des ingénieurs en base de donnée, par exemple ? Ou de celui des concepteurs du langage PHP (on les appelle comment) ? Ou est-ce que ça se passe côté serveur ?
Je sais, je complique. Mais savoir comment tourne le moteur, c'est toujours intéressant.
Il me semble que le principe de fonctionnement est clair : "séparer les données non sûres des commandes et requêtes".
LIRE aussi :
L'exécution d'une requête préparée se déroule en deux étapes : la préparation et l'exécution.
Lors de la préparation, un template de requête est envoyé au serveur de base de données.
Le serveur effectue une vérification de la syntaxe, et initialise les ressources internes du serveur pour une utilisation ultérieure.
Je ne vois pas ce que tu cherches d'autre...
La protection des requêtes préparée intervient parce que on sépare le programme à executer (la requête) des paramètres qui le compose.
Prenons l'exemple suivant :
Si je fait une requête standard , je vais demander à mon serveur d'executer la requête : SELECT * FROM users where id=1; DROP TABLE users;Ce qui va résulter en là suppression de ma table ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $param = "1; DROP TABLE users;" $query = "SELECT * FROM users where id=$param ";
Maintenant si je fait une requête préparée :
Le server SQL va "compiler" la requête à executer, qui va donc être :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $param = "1; DROP TABLE users;" $query = "SELECT * FROM users where id=?";
puis y appliquer le paramètre qui sera
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT * FROM users where id=
Le serveur va donc simplement essayer de trouver un utilisateur avec l'id "1; DROP TABLE users;" et non pas interpréter celà comme une seconde requête collé à la première.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 1; DROP TABLE users;
La seul partie que le serveur execute est la partie que l'on prépare et non la partie paramètre qui pourrait potentiellement contenir d'autres instructions.
Je ne sais pas comme ça marche en interne précisément , mais l'idée général est celle exposée plus haut
Note que les requêtes préparées ne sont pas toujours indispensable. Dans l'exemple précédent , il suffit simplement de faire un intval() sur le paramètre attendu pour éviter tout problème. Elle sont en revanche très pratique dès que les paramètres passée sont textuelles et donc difficiles à controler
Intéressant, j'ai compris, merci. +1
Voyez, ça vaut le coup de détailler.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager