Tutoriel classi...SE CONNECTER
Tutoriel classique SQLite
auteur:php.cn  temps de mise à jour:2022-04-13 17:05:02

Injection SQLite


Si votre site permet aux utilisateurs de saisir via des pages Web et d'insérer le contenu saisi dans une base de données SQLite, vous êtes confronté à un problème de sécurité appelé injection SQL. Cette section vous montrera comment éviter que cela ne se produise et assurer la sécurité de vos scripts et instructions SQLite.

L'injection se produit généralement lorsqu'une entrée de l'utilisateur est demandée, par exemple en demandant à l'utilisateur de saisir un nom, mais l'utilisateur saisit une instruction SQLite, et cette instruction est exécutée sans le savoir sur la base de données.

Ne faites jamais confiance aux données fournies par l'utilisateur, traitez donc uniquement les données qui réussissent la validation. Cette règle est accomplie grâce à la correspondance de modèles. Dans l'exemple ci-dessous, le nom d'utilisateur est limité aux caractères alphanumériques ou aux traits de soulignement et doit comporter entre 8 et 20 caractères. Veuillez modifier ces règles si nécessaire.

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){
   $db = new SQLiteDatabase('filename');
   $result = @$db->query("SELECT * FROM users WHERE username=$matches[0]");
}else{
   echo "username not accepted";
}

Pour illustrer le problème, considérez cet extrait :

$name = "Qadir'; DELETE FROM users;";
@$db->query("SELECT * FROM users WHERE username='{$name}'");

L'appel de fonction consiste à récupérer la colonne de nom de la table utilisateur correspondant au nom spécifié par l'utilisateur. Normalement, $name ne contient que des caractères alphanumériques ou des espaces, comme la chaîne ilia. Mais ici, une toute nouvelle requête est ajoutée à $name, et cet appel à la base de données va provoquer des problèmes catastrophiques : la requête DELETE injectée supprimera tous les enregistrements des utilisateurs.

Bien qu'il existe déjà des interfaces de base de données qui ne permettent pas d'empiler des requêtes ou d'exécuter plusieurs requêtes en un seul appel de fonction, si vous essayez d'empiler une requête, l'appel échouera, mais SQLite et PostgreSQL effectuent toujours des requêtes empilées. c'est-à-dire, exécutez Fournir toutes les requêtes dans une chaîne, ce qui entraîne de graves problèmes de sécurité.

Empêcher l'injection SQL

Dans les langages de script, tels que PERL et PHP, vous pouvez gérer intelligemment tous les caractères d'échappement. Le langage de programmation PHP fournit la fonction de chaîne sqlite_escape_string() pour échapper aux caractères d'entrée spéciaux à SQLite.

if (get_magic_quotes_gpc()) 
{
  $name = sqlite_escape_string($name);
}
$result = @$db->query("SELECT * FROM users WHERE username='{$name}'");

Bien que le codage sécurise l'insertion de données, il permet d'effectuer des comparaisons de texte simples dans les requêtes où la clause LIKE n'est pas disponible pour les colonnes contenant des données binaires.

Veuillez noter que addlashes() ne doit pas être utilisé pour citer des chaînes dans les requêtes SQLite, cela peut conduire à des résultats étranges lors de la récupération de données.

Site Web PHP chinois