MySQL 运算符绕过

在PHP中:

对于select pass from user where username = {$username}的查询语句

当$username=7<0x1时,这一个比较的运算,运算结果为true\

接下来是在MySQL中:

这里先拼接一下SQL语句

select pass from user where username = 7<1

在这个语句中,SQL会先进行语法检测,检测表中是否有字段username再进行查询,由于这里有一个比较运算符,所以查询语句再执行从查询前会先进行比较运算错误就出现在比较运算中,这里比较运算错误的将username=7看做了一个字符串 ,1看作了另一个字符串,而在SQL中,比较运算符为弱比较,相当于PHP中的==运算符,他会先将两个字符串进行同类型转换,结果这里就将username = 7转换为了数字,但是由于第一个字符不是数字而是字符u,因此这里就将username=7转换为0而0是小于1的,所以运算顺序何以理解为:

username = 7<1

转换username=7这个字符串:

0<1

比较运算符运算:

true

最终的查询语句变为:

select pass from user where true

综上所述,我们就可以将这个查询语句理解为:

select pass from user where true

同时我们可以认为:

select pass from user where username = 7<1

select pass from user where 'username = 7'<1

是等价的

select pass from user where 'username = 7'>'1'

也是等价的

以下时MySQL的测试语句

复制代码
select username=7<1;#1即为true
select 'username=7'<1;#1即为true
select 'username=7'>'1';#1即为true
select '2a'<'1';#0即为false,两字符串的比较逻辑是该字符的ASCII码乘
#上该字符所在位置的下标,比方说2a的字符串'大小'是char(2)*1+char(a)*2
#'1'则是同理char(1)*1

以上仅为个人见解,如有错误还请指出更正

相关推荐
m0_6403093018 分钟前
如何用SQL统计每组的平均值同时显示原行_OVER子句
jvm·数据库·python
qq_3721542322 分钟前
Redis如何在应用启动时预热缓存数据
jvm·数据库·python
2601_9498153323 分钟前
Spring Boot中集成MyBatis操作数据库详细教程
数据库·spring boot·mybatis
解救女汉子28 分钟前
CSS如何利用CSS变量进行渐变色管理_提升渐变配置的灵活性
jvm·数据库·python
杨云龙UP34 分钟前
2000—CentOS Linux 7上部署Oracle 19c(19.3) RAC(RedHat/CentOS 7/8)
linux·运维·服务器·数据库·oracle·centos
m0_6784854542 分钟前
怎么导入只包含特定表的SQL文件_正则提取与分离导入
jvm·数据库·python
星晨雪海43 分钟前
若依框架原有页面功能进行了点位管理改造之列表查询(4)
数据库·sql·mybatis
历程里程碑1 小时前
MySQL事务深度解析:ACID到MVCC实战+万字长文解析
开发语言·数据结构·数据库·c++·sql·mysql·排序算法
橄榄熊1 小时前
docker MySQL 密码报错,重新修改保留原样的数据
mysql·docker·容器
NineData1 小时前
NineData 将亮相 2026 德国汉诺威工业博览会
数据库·人工智能·数据库管理工具·ninedata·数据库迁移工具·玖章算术