Maison > Article > base de données > Comment implémenter la troncature des caractères longs dans MySQL
La troncature des caractères longs MySQL, également connue sous le nom de « troncature de colonne SQL », a été proposée par le chercheur en sécurité Stefan Esser en août 2008.
Il existe une option sql_mode dans un paramètre de MySQL. Lorsque sql_mode est défini par défaut, c'est-à-dire lorsque l'option STRICT_ALL_TABLES n'est pas activée (MySQLsql_mode est par défaut), MySQL vous demandera uniquement d'insérer. une valeur trop longue, un avertissement et non une erreur, ce qui peut entraîner des problèmes de troncature.
Créez une nouvelle table pour les tests. La structure de la table est la suivante (MySQL5.1) :
CREATE TABLE USERS( id int(11) NOT NULL, //长度为7 username varchar(7)NOT NULL, password varchar(12)NOT NULL , )
Insérez respectivement les instructions SQL suivantes (messages d'invite d'injection).
①Insérez une instruction SQL normale.
mysql> insert into users(id,username,password)values(1,'admin','admin');//成功插入,无警告,无错误 Query OK,1 row affected(0.00 sec)
②Insérez la mauvaise instruction SQL. À ce stade, il y a trois espaces à droite de "admin" et la longueur est 8, ce qui a dépassé la longueur spécifiée d'origine.
mysql> insert into users(id,username,password)values(2,'admin ','admin'); //成功插入,一个警告 Query OK,1 row affected,1 warning(0.00 sec)
③La mauvaise instruction SQL a été insérée et la longueur a dépassé la longueur spécifiée d'origine.
mysql> insert into users(id,username,password) values(3,'admin x','admin'); //成功插入,一个警告 Query OK,1 row affected,1 warning(0.00 sec)
MySQL indique que les trois instructions ont été insérées dans la base de données, mais les deux dernières instructions ont généré des avertissements. Vous pouvez confirmer s'il a été inséré dans la base de données en exécutant une instruction SQL.
mysql> select username from users;
Vous pouvez voir que les trois données ont été insérées dans la base de données, mais les valeurs ont changé. À ce stade, la longueur est obtenue grâce à la longueur pour déterminer la longueur de la valeur. .
mysql> select length(username)from users where id =1 ;
On peut constater que la longueur des deuxième et troisième données est de 7, qui est la longueur spécifiée de la colonne. On peut voir que par défaut, si les données dépassent la longueur par défaut de. la colonne, MySQL la tronquera.
Mais comment peut-on l'attaquer ainsi ?
Vous le saurez si vous interrogez l'utilisateur dont le nom d'utilisateur est 'admin'.
mysql> select username from users where username='admin';
Seul l'utilisateur nommé admin est interrogé, mais les deux autres utilisateurs administrateur avec des longueurs incohérentes sont également interrogés, ce qui entraînera des problèmes de sécurité. Par exemple, il existe une connexion administrateur qui est jugée comme ceci. , l'instruction est la suivante :
$sql = "select count(*) from users where username='admin' and password='*******;
Même si l'instruction SQL ne présente pas de vulnérabilité d'injection, l'attaquant peut toujours se connecter à la page de gestion. En supposant que le nom d'utilisateur de connexion de l'administrateur est admin, l'attaquant n'a alors qu'à enregistrer un utilisateur « admin » pour accéder facilement à la page de gestion du backend. Le célèbre WordPress a été attaqué de cette manière.
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!