当前位置: 首页 > news >正文

MySQL一隐式转换

  我相信90%以上的同学们在平时开发时,或多或少都被隐式转换(CONVERT_IMPLICIT)坑过,甚至测出bug前你都浑然不知。你还别不信,“无形之刃,最为致命!”

 

mysql> SELECT * from t_user;
+----+-----------+----------+
| id | username  | password |
+----+-----------+----------+
|  1 | 陈哈哈    | abcd1234 |
|  2 | 侨布斯    | 1234     |
|  3 | 提莫      | 1234abcd |
+----+-----------+----------+
3 rows in set (0.00 sec)

不能展示真实数据,见谅~~ 上面是这张用户表的原始数据,侨总用下面的SQL查询自己这行数据,大家先看看有没有问题?

SELECT * from t_user where `password`=1234;
感觉没有明显的毛病?来看看结果:
mysql> SELECT * from t_user where `password`=1234;
+----+-----------+----------+
| id | username  | password |
+----+-----------+----------+
|  2 | 侨布斯    | 1234     |
|  3 | 提莫      | 1234abcd |
+----+-----------+----------+
2 rows in set, 1 warning (0.00 sec)

???这怎么把提莫队长给打现行了?

好了,其实这算是MySQL给开发者留下的不友好的礼物(坑)。今天我们一起从以下三个角度去聊一聊MySQL的隐式转换。

索引

1、SQL语句中隐式转换的坑

先看一下官方的隐试转换说明:
在这里插入图片描述

翻译成人话:

  1. 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换。
  2. 两个参数都是字符串,会按照字符串来比较,不做类型转换
  3. 两个参数都是整数,按照整数来比较,不做类型转换
  4. 十六进制的值和非数字做比较时,会被当做二进制串
  5. 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
  6. 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
  7. 所有其他情况下,两个参数都会被转换为浮点数再进行比较。(这里所说的浮点数一般默认为double类型)

  可以看到,非前六种以外的类型转换都要转成浮点类型来处理,这意味着什么?意味着MySQL承认了隐式转换这个事儿,还表示不爱看官方文档的哥们儿出问题活该~~

  我们用一些具体示例来看一下,通过下述SQL可见,当1234没有引号也就是整数时,‘1234abcd’ = 1234 → true,说明MySQL对’1234abcd’做了转型,转成了浮点类型,结果是:1234abcd => 1234

# 0:false;1:true
mysql> SELECT '1234abcd' = '1234';
+---------------------+
| '1234abcd' = '1234' |
+---------------------+
|                   0 |
+---------------------+
1 row in set (0.00 sec)# 0:false;1:true
mysql> SELECT '1234abcd' = 1234;
+-------------------+
| '1234abcd' = 1234 |
+-------------------+
|                 1 |
+-------------------+
1 row in set, 1 warning (0.00 sec)

  为啥1234abcd => 1234呢? 其实’1234’和’abcd’都会转成浮点数,即:1234+0=1234,非数字类型的都被直接转成了 0

mysql> SELECT '1234' + 'abcd';
+-----------------+
| '1234' + 'abcd' |
+-----------------+
|            1234 |
+-----------------+
1 row in set, 1 warning (0.00 sec)

  你发现了什么?原来字符串涉及到 +=-/ 等等运算符时都会进行隐式转型,也就是转成double,那么字符串转double是怎么转的呢?

# 转成:'1aaaa' = 1
mysql> SELECT '1aaaa' = 1;
+-------------+
| '1aaaa' = 1 |
+-------------+
|           1 |
+-------------+
1 row in set, 1 warning (0.00 sec)# 转成:'a1111' = 0
mysql> SELECT 'a1111' = 1;
+-------------+
| 'a1111' = 1 |
+-------------+
|           0 |
+-------------+
1 row in set, 1 warning (0.00 sec)# 转成:0 + 0 =0
mysql> SELECT 'aa' + 'aa' = 1;
+-----------------+
| 'aa' + 'aa' = 1 |
+-----------------+
|               0 |
+-----------------+
1 row in set, 2 warnings (0.00 sec)# 转成:0 + 0 + 1 =1
mysql> SELECT 'aa' + 'aa' + '1' = 1;
+-----------------------+
| 'aa' + 'aa' + '1' = 1 |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set, 2 warnings (0.00 sec)

  可见,是以字符串从左向右取值的,且从非数字起后面的值都被转成 0,如a11111,第一位为a,则整体转为 01aaaa第一位为1,第二位为a,从第二位往后转成0,得a11111 → 0

mysql> SELECT * from t_user where `password`=1234;
+----+-----------+----------+
| id | username  | password |
+----+-----------+----------+
|  2 | 侨布斯    | 1234     |
|  3 | 提莫      | 1234abcd |
+----+-----------+----------+
2 rows in set, 1 warning (0.00 sec)

  现在我们就明白为什么能匹配到提莫了。因为在不同类型转换时"1234abcd"被转成了浮点类型,"abcd"转成浮点型后为0,因此MySQL判为:“1234abcd” = ‘1234’ + 0 。

2、黑客同学喜欢用隐式转换进行SQL注入攻击

通过第一部分隐式转换的了解,我们可以预测一些简单SQL注入的方式:

mysql> SELECT * from t_user where username='陈哈哈' and `password`=0;
+----+-----------+----------+
| id | username  | password |
+----+-----------+----------+
|  1 | 陈哈哈    | abcd1234 |
+----+-----------+----------+
1 row in set, 1 warning (0.00 sec)
果然,我账号的密码被毫无意外的攻破了

如果有些朋友公司的网站用的是下面的写法:

select * from t_user where username=${username} and `password`=${password};

  不然有些小伙伴友好的把请求参数构建成 username → a' OR 1='1 ,那么password是啥都无所谓了,是吧。

懂我意思吧,快改了。

  当然,其实很多注入攻击的真实目的,并不是用来破解用户账号的,而是破坏服务器。一般我们在页面F12发现有问题的接口后,通过脚本模拟请求参数(构造注入参数),去不断尝试自定义构造limit、order、where等条件,或许花不了多久就能通过一个不规范的请求入口,检索出该表甚至其他大表全量信息。导致公司服务器负载异常,连接数打满,CPU200%等有趣的情况。有兴趣的同学可以花几小时尝试破解自己公司的web~~

3、索引中隐式转换的坑

  同理,在MySQL根据索引进行查询时,如果你的username字段有索引且为varchar类型,且查询如下时:

select * from t_user where username=123;

该SQL会出现两个问题:

1、索引失效
  无法使用到索引查询,因为mysql会在引擎层进行类型隐式转换(CONVERT_IMPLICIT),会先把username隐式转换成浮点数,然后再跟你的123进行比较,然而你的索引是建在username上的,并不是在转换后的username上的,所以进行转换后的username相当于没有索引。会全表扫描,换做大表中,无法使用索引,你懂得。

2、查询结果不准确
  第一部分我们已经举例说明,MySQL在隐式转换时的varchar转double,会出现很多意想不到的情况,比如 “123”," 123","123a"都会转成123,实际场景中都是不允许出现的。

 

总结

就是当sql中一个字符串和一个数字做+=-/ 计算时,如"a1bc"+1,   "ccccd3"=0

这个字符串中的非数字的字符会被隐式转换成0并且再转换为空,再去做比较.只分以下两种情况:

1.前面的字符不是数字时,直接等于0,如"a1"=0,"abcd1"=0

2.前面的字符是数字时,从第一个开始截取,从左往右直到出现的第一个不是数字的字符为止,截取的字符串就是最终转换的值,如"1a"=1,"2a3b"=2,"55555h666666"=55555

  

相关文章:

MySQL一隐式转换

我相信90%以上的同学们在平时开发时&#xff0c;或多或少都被隐式转换&#xff08;CONVERT_IMPLICIT&#xff09;坑过&#xff0c;甚至测出bug前你都浑然不知。你还别不信&#xff0c;“无形之刃&#xff0c;最为致命&#xff01;” mysql> SELECT * from t_user; ---------…...

风光并网对电网电能质量影响的matlab/simulink仿真建模

之前配电网的一个项目&#xff0c;我把其中一部分分享给大家&#xff0c;电能质量影响这部分&#xff0c;我在模型中主要体现的就是不同容量的光伏、风电接入&#xff0c;对并网点的电压影响情况。&#xff08;主页还有单独风电并网系统&#xff0c;光伏并网发电系统以及微电网…...

浅谈Spring循环依赖

文章目录1.前言2.什么是循环依赖&#xff1f;3.两种Spring容器循环依赖3.1.构造器循环依赖&#xff08;无法解决&#xff09;3.2.setter循环依赖&#xff08;可以解决&#xff09;3.3.小结4.循环依赖检查5.循环依赖的处理5.1.单例setter循环依赖5.2.Spring解决循环依赖5.3. 循环…...

华为OD机试题 - 拼接 URL(JavaScript)| 包含代码编写思路

最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 华为OD机试题 最近更新的博客使用说明拼接 URL题目…...

【FFMPEG】Filtering Introduction[翻译/举例]

Filtering Introduction Filtering in FFmpeg is enabled through the libavfilter library. FFmpeg中的Filtering可以通过libavfilter library来使用。 In libavfilter, a filter can have multiple inputs and multiple outputs. To illustrate the sorts of things that are…...

什么是IP65?仅仅是防水等级吗?看完本文直呼666!

IP65在硬件设备&#xff0c;准确的来说在电气设备中&#xff0c;这个参数很常见&#xff0c;但是作为网络技术的博主&#xff0c;为啥要介绍IP65&#xff1f; 这个很好解释&#xff0c;因为网络设备&#xff0c;比如路由器、交换机&#xff0c;还有服务器、监控等都是属于电气…...

Flask入门(10):数据库连接池

目录10.数据库连接池模式一模式二示例&#xff1a;使用数据库连接池进行登录验证10.数据库连接池 参考&#xff1a;https://www.cnblogs.com/wangkun122/articles/8992637.html 通过DBUtils实现数据库连接池 安装&#xff1a; pip install DBUtils1.2注意&#xff1a;pytho…...

华为OD机试C++实现 - 最小步骤数

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

数仓:用户行为类指标一网打尽

前言 用户行为分析是对用户在产品或触点上产生的行为及行为背后的数据进行分析&#xff0c;通过构建用户行为数据分析体系或者用户画像&#xff0c;来改变产品、营销、运营决策&#xff0c;实现精细化运营&#xff0c;指导业务增长。总之&#xff0c;很重要。 先来看下用户类…...

mysql数据库的主从复制

一、实现主从复制的方式。 异步复制&#xff1a;它是mysql默认的同步方式&#xff0c;从库通过io线程去拉取 bin log时&#xff0c;主库不需要关注这个时候是否有从库在同步数据&#xff0c;他只做自己的事情就可以了&#xff0c; 整个复制过程都是异步完成的 ; 半同步复制&…...

【极海APM32替代笔记】低功耗模式、WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断)

【极海APM32替代笔记】低功耗模式、WFI命令等进入不了休眠的可能原因&#xff08;系统定时器SysTick一直产生中断&#xff09; 【STM32笔记】低功耗模式配置及避坑汇总 前文&#xff1a; blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模…...

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。

前言 秒杀和高并发是面试的高频考点&#xff0c;也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目&#xff0c;提交PR&#xff0c;提高竞争力。早日上岸&#xff0c;升职加薪。 知识点详解 秒杀系统架构图 秒杀流程图 秒杀系统设计 这篇文章一万多字&#xff0c;…...

华为OD机试真题 用 C++ 实现 - 子序列长度 | 多看题,提高通过率

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

华为OD机试题 - 符合条件的子串长度(JavaScript)| 包含代码编写思路

最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 华为OD机试题 最近更新的博客使用说明符合条件的子…...

快速读懂网络拓扑图

快速读懂网络拓扑图几重常见的网络拓扑总线型拓扑简介优点缺点环型拓扑简介优点缺点星型拓扑简介优点缺点网络层级机构节点结点链路通路不同的连接线代表什么意思&#xff1f;不同颜色、粗细的直线代表什么意思&#xff1f;闪电线-串行链路几重常见的网络拓扑 总线型拓扑 简介…...

《上海市创新型企业总部认定和奖励管理办法》

各区人民政府、有关单位&#xff1a; 为加快推动上海创新型经济发展&#xff0c;支持各类高成长性企业和研发机构升级打造创新型企业总部&#xff0c;培育壮大更多高能级创新主体&#xff0c;为建设具有全球影响力的科技创新中心提供支撑&#xff0c;现将《上海市创新型企业总…...

LeetCode 160. 相交链表 -- 消除长度差

相交链表 简单 2K 相关企业 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意…...

《分布式技术原理与算法解析》学习笔记Day19

分布式通信&#xff1a;消息队列 什么是消息队列&#xff1f; 队列是一种具有先进先出特点的数据结构&#xff0c;消息队列是基于队列实现的、存储具有特定格式的消息数据。消息以特定格式放入这个队列的尾部后直接返回&#xff0c;不需要系统马上处理&#xff0c;之后有其他…...

云、安全、网络三位一体,Akamai 推出大规模分布式边缘和云平台 Akamai Connected Cloud

出品 | CSDN 云计算 云服务市场规模在持续增长。 基于网络技术积累与优势&#xff0c;与布局边缘计算之后&#xff0c;巨头 Akamai 在继续推进它的技术与产品进程。近日&#xff0c;Akamai 正式推出大规模分布式边缘和云平台 Akamai Connected Cloud&#xff0c;包含云计算、安…...

生产者消费者模型(多线程工作)

目录 1.模型前提 2.阻塞队列&#xff08;消费场所&#xff09; 3. 实验 4.有关效率 1.模型前提 以单生产者对单消费者为例子&#xff1a; 前提一&#xff1a;有一个缓冲区作为消费场所。 前提二&#xff1a;有两种功能不同的线程分别具有消费与生产的能力。 前提三&…...

精准靶向学习:AFSS让YOLO训练效率提升 1.43~1.70 倍的奥秘

精准靶向学习&#xff1a;AFSS让YOLO训练效率提升 1.43~1.70 倍的奥秘YOLO系列是实时目标检测的首选&#xff0c;推理速度毫秒级&#xff0c;工业场景到处在用。但训练效率低这个问题&#xff0c;让人头疼。 数据&#xff1a;YOLO11s在MSCOCO2017上&#xff0c;推理200FPS&…...

公众号流量分成大涨!后公众号时代如何运营?流量商店旗下的互粉平台成增粉利器!

“上个月流量主收入终于突破5000元了&#xff01;”深夜&#xff0c;运营“职场进化论”公众号的小林在朋友圈晒出后台截图。一年前&#xff0c;这个只有几百粉丝的账号月收入还不到100元。而如今&#xff0c;像小林这样依靠公众号流量分成实现可观收入的创作者正越来越多。 20…...

Wireshark过滤规则、OSI模型与TCP三次握手详解

本文内容有以下三个部分&#xff1a; wireshark过滤规则osi模型简述tcp三次握手 一、wireshark过滤规则 wireshark只是一个抓包工具&#xff0c;用其他抓包工具同样能够分析tcp三次握手协议。例如&#xff0c;Sniffmaster是一款全平台抓包工具&#xff0c;支持HTTPS、TCP和UDP协…...

OpenClaw成本控制:Qwen3.5-9B任务拆分与Token节省策略

OpenClaw成本控制&#xff1a;Qwen3.5-9B任务拆分与Token节省策略 1. 为什么需要关注OpenClaw的Token消耗&#xff1f; 去年夏天&#xff0c;当我第一次在本地部署OpenClaw对接Qwen3.5-9B模型时&#xff0c;被一个简单的文件整理任务消耗了将近2000个Token。这让我意识到&…...

《高效能人士的七个习惯》:从内圣到外王的完整方法论

这本书在全世界卖了千万册&#xff0c;斯蒂芬柯维用七个习惯构建了一套从自我管理到影响他人的完整体系。一、前言&#xff1a;比七个习惯更重要的两件事 很多人读这本书只关注七个习惯本身&#xff0c;却忽略了前言中两个至关重要的前提&#xff1a; 1. 积极乐观是一切的起点 …...

Kuikly动态化跨端框架的多维特性与选型实践

Kuikly&#xff0c;是指基于Kotlin MultiPlatform(KMP)构建的跨端开发框架&#xff0c;利用KMP的逻辑跨平台能力&#xff0c;抽象通用跨平台UI渲染接口&#xff0c;复用平台UI组件&#xff0c;实现UI跨平台&#xff0c;具备轻量、高性能、可动态化优势&#xff1b;其核心特点是…...

002、现代Python后端开发环境与工具链搭建

002、现代Python后端开发环境与工具链搭建 上周排查一个线上问题&#xff0c;日志里报了个ImportError: cannot import name ... from partially initialized module。花了半小时才发现&#xff0c;是同事本地虚拟环境混用了Python 3.8和3.10的依赖&#xff0c;打包时没锁版本。…...

OpenClaw故障排查大全:Phi-3-vision-128k接口连接异常解决方案

OpenClaw故障排查大全&#xff1a;Phi-3-vision-128k接口连接异常解决方案 1. 问题背景与排查思路 上周在本地部署Phi-3-vision-128k模型时&#xff0c;遇到了vllm服务超时、chainlit前端无响应等一系列问题。经过三天反复调试&#xff0c;终于梳理出一套完整的排查方案。本文…...

Python MCP服务器开发面试必考题全解析:从协议设计到并发压测,97%候选人栽在这3个盲区

第一章&#xff1a;Python MCP服务器开发面试全景概览Python MCP&#xff08;Model-Controller-Protocol&#xff09;服务器并非标准框架术语&#xff0c;而是近年来在微服务与协议网关场景中逐渐形成的工程实践模式——强调以协议适配为核心、模型驱动行为、控制器协调生命周期…...

超高效!这款音视频转文字神器,让你告别手动输入!

今天给大家推荐一款非常实用的软件——“Whisper”&#xff0c;它是一款功能强大的音视频转文字工具。这款软件是绿色版&#xff0c;双击打开后&#xff0c;会弹出一个黑色的界面框&#xff0c;请不要关闭它。使用这款软件非常简单。首先&#xff0c;点击【选择文件】按钮&…...