Maison >base de données >tutoriel mysql >Exemples d'injection SQL et comment empêcher l'injection SQL
L'injection SQL consiste à utiliser l'interface externe de certaines bases de données pour insérer les données utilisateur dans le langage de opération de base de données réel. Afin d’atteindre l’objectif d’envahir la base de données et même le système d’exploitation. Dans le domaine de la sécurité, 我们永远不要信任用户的输入
, nous devons déterminer que les données saisies par l'utilisateur ne sont pas sûres, et nous devons tous filtrer les données saisies par l'utilisateur. 没有(运行时)编译,就没有注入。
Donc, la manière de prévenir fondamentalement les types d'attaques ci-dessus est d'empêcher les données d'être transformées en code et d'être exécutées, et de toujours distinguer les limites entre le code et les données. En ce qui concerne spécifiquement l'injection SQL, le code malveillant exécuté est compilé via le moteur d'interprétation SQL de la base de données, il suffit donc d'empêcher que les données saisies par l'utilisateur soient compilées par le système de base de données.
Contrairement à d'autres bases de données, MySQL peut s'exécuter dans différents modes SQL (mode serveur SQL) et peut appliquer différents modes à différents clients. De cette façon, chaque application peut personnaliser le mode de fonctionnement du serveur en fonction de ses propres besoins. Le schéma définit quelle syntaxe SQL MySQL doit prendre en charge et quel type de contrôles de validation des données doivent être effectués. Ceci est quelque peu similaire à Apache configurant différents niveaux de journaux d'erreurs, quelles erreurs sont signalées et quelles erreurs ne sont pas signalées.
//php代码 $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('{$unsafe_variable}')");
Lorsque le code dans le message est le suivant :
value'); DROP TABLE table;--
Le code de requête devient
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Cela supprimera directement la table et vos données seront détruites.
Méthode 1
prepareStatement+Bind-Variable : les instructions SQL et les paramètres de requête sont envoyés respectivement au serveur de base de données pour analyse.
Il existe deux méthodes d'implémentation pour php.
//使用PDO(PHP data object) $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name)); foreach ($stmt as $row) { // do something with $row } //使用mysql扩展-mysqli $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something with $row }
Méthode 2
Échapper à l'instruction de requête (la manière la plus courante) : utilisez la fonction de conversion fournie par l'application.
|Application|Fonction|
|--------| |MySQL C API | mysql_real_escape_string ()| |MySQL++|escape和quote修饰符| |PHP|使用mysql_real_escape_string()(适用于PHP4.3.0以前),之后可以使用mysqli或pdo| | Perl DBI|placeholder或quote()| |Ruby DBI|placeholder或quote()|
Méthode 3
Utilisez votre propre fonction définie pour la vérification : il s'agit essentiellement toujours d'Entrer données illégales pour s'échapper et filtrer.
La validation des entrées peut être divisée en : 1. Organiser les données pour les rendre valides ; 2. Rejeter les entrées illégales connues ; 3. Accepter uniquement les entrées légales connues.
Méthode 4
Utiliser la procédure stockée .
Pour les procédures stockées, voir : (9) Procédures stockées et fonctions personnalisées dans mysql
#查看当前sql模式 select @@sql_mode; #查看当前sql模式 SELECT @@session.sql_mode; #修改当前sql模式 SET [SESSION][GLOBAL] sql_mode='modes';
L'option session signifie qu'elle ne prendra effet que dans cette connexion ; et global signifie qu'elle ne prendra pas effet dans cette connexion et prendra effet lors de la prochaine connexion ; .
Vous pouvez également utiliser "--sql-mode='modes'" pour définir sql_mode au démarrage de MySQL.
peut être défini dans le fichier de configuration.
ONLY_FULL_GROUP_BY :
Pour GROUP BYagrégation, si la colonne dans SELECT n'est pas dans GROUP apparaît dans BY, alors ce SQL est illégal car la colonne n'est pas dans la clause GROUP BY.
NO_AUTO_VALUE_ON_ZERO :
Cette valeur affecte l'insertion de colonnes à augmentation automatique. Dans les paramètres par défaut, l'insertion de 0 ou NULL représente la génération de la prochaine valeur auto-augmentante. Cette option est utile si l'utilisateur souhaite insérer une valeur de 0 et que la colonne s'augmente automatiquement.
STRICT_TRANS_TABLES :
Dans ce mode, si une valeur ne peut pas être insérée dans une table de transaction, l'opération en cours sera interrompue et il n'y aura aucune limite sur les tables non-transaction .
NO_ZERO_IN_DATE :
En mode strict, zéro jour et mois ne sont pas autorisés.
NO_ZERO_DATE :
Définissez cette valeur, la base de données mysql n'autorise pas l'insertion de dates nulles, et l'insertion de dates nulles générera une erreur au lieu d'un avertissement.
ERROR_FOR_pISION_BY_ZERO :
Pendant INSERT ou UPDATE, si les données sont divisées par zéro, une erreur est générée au lieu d'un avertissement. Si le mode n'est pas donné, MySQL renvoie NULL lorsque les données sont divisées par zéro.
NO_AUTO_CREATE_USER :
Interdit à GRANT de créer des utilisateurs avec des mots de passe vides.
NO_ENGINE_SUBSTITUTION :
Lance une erreur si le moteur de stockage requis est désactivé ou n'est pas compilé. Lorsque cette valeur n'est pas définie, le moteur de stockage par défaut est utilisé à la place et une exception est levée.
PIPES_AS_CONCAT :
traite "||" comme une concaténation opérateur de chaîne au lieu de ou opérateur , qui est le identique à la base de données Oracle et similaire à la fonction de concaténation de chaînes Concat.
ANSI_QUOTES :
Avec ANSI_QUOTES activé, vous ne pouvez pas citer une chaîne avec des guillemets doubles, car elle est interprétée comme un identifiant.
Explication
Le paramètre sql_mode d'ORACLE est équivalent à : PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.
[Recommandations associées]
1 Tutoriel vidéo en ligne MySQL gratuit
2. Dernier tutoriel manuel MySQL.
3. Tutoriel vidéo d'introduction à l'éducation booléenne Yan Shiba mysql
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!