Protection de votre base de données : utilisation appropriée de LIKE '%{$var}%' dans les instructions préparées
La création de fonctionnalités de recherche dynamique qui répondent aux entrées des utilisateurs nécessite un examen attentif de la sécurité. Un scénario courant consiste à rechercher des noms d'utilisateur contenant une correspondance partielle, à l'aide de l'opérateur LIKE
de MySQL. Cependant, l'incorporation directe d'une entrée utilisateur dans une clause LIKE
dans une instruction préparée est sujette aux vulnérabilités d'injection SQL.
Les approches incorrectes impliquent souvent de tenter d'incorporer des espaces réservés dans les caractères génériques LIKE
, tels que SELECT * FROM users WHERE username LIKE '%{?}%'
. Ceci est erroné car la syntaxe de l'espace réservé n'est pas correctement interprétée par le pilote de base de données.
La clé pour sécuriser la mise en œuvre réside dans la construction de l'LIKE
expression avant de préparer la déclaration. Cela garantit que les entrées de l'utilisateur sont correctement nettoyées et traitées comme des données et non comme du code exécutable. Voici la bonne méthode :
<code class="language-php">$searchParam = "%" . $yourParam . "%"; // Prepend and append wildcards $stmt = $mysqli->prepare("SELECT * FROM REGISTRY WHERE name LIKE ?"); $stmt->bind_param("s", $searchParam); // Bind the complete LIKE expression $stmt->execute();</code>
Dans cet exemple amélioré, les caractères génériques %
sont ajoutés au $yourParam
fourni par l'utilisateur pour créer le modèle LIKE
complet stocké dans $searchParam
. Ce modèle complet est ensuite lié à l'espace réservé de l'instruction préparée en utilisant bind_param
avec le type de chaîne ("s"). Cela empêche l'injection SQL tout en conservant la fonctionnalité de recherche dynamique. Cette approche garantit à la fois la sécurité et l'efficacité offerte par les relevés préparés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!