L'injection SQL est une méthode d'attaque. Un attaquant manipule la base de données pour effectuer des opérations non autorisées en insérant du code SQL malveillant dans des requêtes SQL. Pour supprimer les instructions, les attaquants peuvent supprimer des données qui ne doivent pas être supprimées via l'injection SQL et peuvent même supprimer l'intégralité du tableau de la base de données, en apportant de sérieux risques de sécurité.
Pour prévenir efficacement l'injection de SQL, l'approche la plus recommandée consiste à utiliser des instructions préparées . PHP fournit des extensions MySQLI et PDO utilisées lors de l'interaction avec les bases de données MySQL, les deux prenant en charge les instructions préparées. De cette façon, les données de requête SQL et les données de l'utilisateur d'entrée peuvent être séparées, empêchant ainsi l'injection des entrées malveillantes en instructions SQL.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Connexion de base de données</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"username"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database_name"</span></span><span>);
</span><span><span class="hljs-comment">// Vérifiez la connexion</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// Supposons que nous voulons supprimerIDEnregistrements des valeurs fournies à un utilisateur</span></span><span>
</span><span><span class="hljs-variable">$user_id</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>]; </span><span><span class="hljs-comment">// depuisURLFaire fournir l'utilisateur par l'utilisateurID</span></span><span>
</span><span><span class="hljs-comment">// Utilisez des déclarations préparées pour éviterSQLinjection</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM users WHERE id = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"i"</span></span><span>, </span><span><span class="hljs-variable">$user_id</span></span><span>); </span><span><span class="hljs-comment">// "i" Indique que le paramètre est un type entier</span></span><span>
</span><span><span class="hljs-comment">// Instruction d'exécution</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// Vérifiez si la suppression est réussie</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>->affected_rows > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Les enregistrements ont été supprimés。"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Le dossier n'a pas été trouvé ou la suppression a échoué。"</span></span><span>;
}
</span><span><span class="hljs-comment">// Fermer la connexion</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans le code ci-dessus, $ stmt-> bind_param () est utilisé pour lier l'entrée d'ID par l'utilisateur en tant que paramètre, je signifie que le paramètre est un type entier. Cela peut effectivement empêcher l'injection SQL, car l'ID entré par l'utilisateur sera transmis en toute sécurité à l'instruction SQL en tant que paramètre et ne sera pas directement intégré dans l'instruction SQL.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-comment">// Connexion de base de données</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=database_name'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);
</span><span><span class="hljs-comment">// Supposons que nous voulons supprimerIDEnregistrements des valeurs fournies à un utilisateur</span></span><span>
</span><span><span class="hljs-variable">$user_id</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>]; </span><span><span class="hljs-comment">// depuisURLFaire fournir l'utilisateur par l'utilisateurID</span></span><span>
</span><span><span class="hljs-comment">// Utiliser des instructions préparées</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM users WHERE id = :id"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':id'</span></span><span>, </span><span><span class="hljs-variable">$user_id</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_INT</span></span><span>);
</span><span><span class="hljs-comment">// Instruction d'exécution</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// Vérifiez si la suppression est réussie</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rowCount</span></span><span>() > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Les enregistrements ont été supprimés。"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Le dossier n'a pas été trouvé ou la suppression a échoué。"</span></span><span>;
}
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"erreur: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans PDO , BindParam () est utilisé pour lier les paramètres entrés par l'utilisateur dans une instruction SQL et spécifier son type en tant qu'entier via PDO :: param_int . Cela empêche également l'injection de SQL.
En plus d'utiliser des instructions préparées, une autre protection de sécurité efficace consiste à vérifier et à filtrer l'entrée de l'utilisateur. Dans les opérations de suppression, en particulier pour les champs d'identification, il est nécessaire de s'assurer qu'il s'agit d'un entier légal.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$user_id</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>];
</span><span><span class="hljs-comment">// Vérifiez que l'entrée est un entier légal</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">filter_var</span></span><span>(</span><span><span class="hljs-variable">$user_id</span></span><span>, FILTER_VALIDATE_INT)) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Utilisateur non valideID"</span></span><span>);
}
</span><span><span class="hljs-comment">// Effectuer une opération de suppression de la base de données</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Utilisez la fonction filter_var () pour vérifier si l'ID fourni par l'utilisateur est un entier légal. Sinon, l'exécution sera arrêtée directement. Cette vérification supplémentaire peut améliorer la sécurité.
Suivez toujours le principe des moindres autorisations lors de l'interaction avec une base de données. Le compte de la base de données ne doit avoir l'autorisation que d'effectuer les actions nécessaires. Par exemple, l'opération de suppression ne doit permettre des comptes de base de données spécifiques, plutôt que d'accorder des autorisations complètes aux comptes de base de données. De cette façon, même si une vulnérabilité d'injection SQL se produit, les actions qu'un attaquant peut effectuer sera limitée.
Afin de détecter les attaques d'injection SQL potentielles en temps opportun, il est recommandé d'activer la fonction de journalisation SQL de la base de données et de surveiller la base de données. Cela aide à suivre une activité anormale lorsqu'une attaque se produit et à prendre des mesures préventives rapidement.
Enfin, le maintien de PHP, des bases de données et tous les composants connexes mis à jour est la clé pour prévenir les vulnérabilités de sécurité. Vérifiez fréquemment les avis de sécurité pour vous assurer que tous les systèmes sont chargés des derniers correctifs de sécurité.
Étiquettes associées:
SQL