Que fait bind_param?
Je suis en train d'apprendre sur la façon d'éviter des injections SQL et je suis un peu confus.
Lors de l'utilisation de bind_param, je ne comprends pas le but. Sur la page du manuel, j'ai trouvé ça par exemple:
$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
Maintenant, en supposant que ces 4 variables ont été utilisateur renseigné, je ne comprends pas comment cela empêche les injections SQL. Selon ma compréhension, ils peuvent toujours entrer tout ce qu'ils veulent.
Je ne peux pas trouver une explication à la 'sssd'
. Que faut-il faire? C'est que ce qui le rend sûr-er?
Dernière question: j'ai lu sur une autre question que mysqli_real_escape_string
est obsolète, mais cela ne veut pas dire que dans le manuel. Comment est-elle obsolète? Ne peut-il pas échapper les caractères spéciaux de plus pour une raison quelconque?
Remarque: Cette question a expliqué ce bind_param fait, mais je ne comprends toujours pas pourquoi il est plus sûr ou plus protégés.
Bind_param explication
source d'informationauteur EveyPortman
Vous devez vous connecter pour publier un commentaire.
Le principe il y a à l'aide d'une instruction préparée, qui est conçu pour l'envoi sûr de la requête au serveur de base de données, ce qui peut être fait par échapper à la saisie de l'utilisateur qui n'est pas une partie de la réalité de la requête, et également la vérification de la requête sans aucune (clause where) pour vérifier la validité de la requête avant de l'aide de tous les paramètres.
À partir de cette question: AOP envoie raw requête à MySQL alors que Mysqli envoie requête préparée, à la fois de produire le même résultat
journaux de serveur:
En Utilisant une instruction préparée db serveur vérifie la requête sans aucun paramètre, à ce stade, des erreurs peuvent être détectées avant la liaison de n'importe quel paramètre, puis, si la requête est valide, les paramètres seront également à envoyer au serveur pour la finalisation de la requête.
De Manuel PHP http://php.net/manual/en/mysqli.quickstart.prepared-statements.php:
..
La réponse est ici: http://php.net/manual/en/mysqli-stmt.bind-param.php
Pouvez-vous donner une référence? Je pense que vous avez mal compris (
mysql_real_escape_string()
)En utilisant les instructions préparées vous séparer SQL les requêtes de l'utilisateur à partir des données saisies. Au lieu de saisie des données, vous mettez des espaces réservés ('?' char) dans votre requête SQL. Ensuite vous envoyer la requête au serveur de bases de données (ex: MySQL) par le biais de la "mysqli::préparer" de la méthode. Donc, le serveur vérifie que tout est ok et, dans l'affirmative, il attend les données d'entrée. Maintenant qu'il connaît déjà votre requête. Juste a attendre pour les données d'entrée pour se lier à la requête.
À ce stade, "bind_param" entre en action, la liaison des espaces réservés à l'utilisateur saisit des données.
Notez que bind_param seulement lie des données à des espaces réservés laissant inchangée la requête.
Donc, il n'y a pas moyen de modifier l'original de la requête SQL, parce qu'il a déjà envoyé au serveur par le biais de la méthode préparer et parce que vous êtes l'envoi de requêtes SQL et les données d'entrée séparément l'utilisateur a entré les données ne peuvent pas interférer avec les requêtes.
De toute façon...
Le véritable but de l'utilisation d'une requête préparée dans SQL est de réduire le coût de traitement des requêtes, de ne PAS séparer les données de la requête. C'est la façon dont il est utilisé maintenant, pas la façon dont il a été conçu pour être utilisé en premier lieu.
'sssd" signifie "chaîne", "string", "string" et "double".
En fait: $code est une chaîne, $langue est une chaîne, $officielle est une chaîne de caractères $et % est de type double.
mysqli_real_escape_string n'est pas obsolète mais mysql_real_escape_string est obsolète
(le premier est mysqlI, où I est l'acronyme de "amélioré").