Cet article traite des vulnérabilités courantes de l'injection SQL dans les applications ThinkPHP et fournit un guide complet pour les prévenir. Nous couvrirons les requêtes paramétrées, les meilleures pratiques et les mesures de sécurité supplémentaires.
empêcher l'injection de SQL dans les charnières de réflexion sur les requêtes paramétrées (également connues sous le nom de déclarations préparées) et l'adhésion aux pratiques de codage sécurisées. L'intégration directe de l'entrée des utilisateurs dans les requêtes SQL est la principale cause de vulnérabilités d'injection SQL. ThinkPhp, comme d'autres cadres, propose des mécanismes pour éviter cette pratique dangereuse. Le principe principal est de séparer les données du code SQL. Au lieu de construire des requêtes SQL en concaténant les chaînes fournies par l'utilisateur, utilisez des espaces réservés que le pilote de base de données remplacera en toute sécurité par des valeurs désinfectées.
Le constructeur de requête de base de données de ThinkPhp fournit un moyen pratique pour y parvenir. Au lieu d'écrire des requêtes SQL brutes comme celle-ci ( hautement vulnérables ):
<code class="php">$username = $_GET['username']; $password = $_GET['password']; $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; $result = Db::query($sql);</code>
Vous devez utiliser les méthodes du constructeur de requête:
<code class="php">$username = $_GET['username']; $password = $_GET['password']; $user = Db::name('users')->where(['username' => $username, 'password' => $password])->find();</code>
Cette approche désinfecte automatiquement l'entrée, empêchant l'injection SQL. La méthode where
gère la liaison des paramètres en interne, en garantissant que la base de données traite $username
et $password
en tant que données, pas de code exécutable.
Les vulnérabilités d'injection SQL courantes dans les applications de ThinkPhp sont souvent en train de négliger la négligence pour assainir les entrées d'utilisateurs avant les données. Cela peut se manifester de plusieurs manières:
Db::query()
avec SQL brut: tandis que Db::query()
offre une flexibilité, en utilisant les SQL brutes, en laissant vos applications insistantes. Vulnérable. find()
ou select()
sans clauses appropriées where
: tandis que les méthodes ORM de ThinkPHP comme find()
et select()
sont généralement plus sûres que les SQL brutes, en utilisant l'exposition sans spécification where
Clauses peuvent conduire à une exposition de données non intentionnée si elles ne sont pas prudentes. Par exemple, permettre aux utilisateurs d'influencer directement le paramètre id
dans un find()
l'appel pourrait permettre l'accès à des enregistrements arbitraires. Le constructeur de requêtes de base de données de ThinkPhp utilise intrinsèquement les requêtes paramétrées. En utilisant des méthodes comme where()
, find()
, select()
, update()
, et delete()
, vous tirez parti de la protection intégrée du cadre contre l'injection SQL. Ces méthodes gèrent automatiquement la liaison des paramètres, garantissant que les entrées utilisateur sont traitées comme des données et non du code exécutable.
Pour des scénarios plus complexes où vous pourriez avoir besoin de plus de contrôle, vous pouvez toujours utiliser des requêtes paramétrées avec Db::query()
mais vous assurer d'utiliser les espaces réservé Données fournies par l'utilisateur, empêchant l'injection SQL. ThinkPHP gérera l'échappement et la liaison appropriés du paramètre. ?
Même avec des requêtes paramétrées, des mesures de sécurité supplémentaires sont cruciales pour une défense robuste contre l'injection SQL:
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!