用户输入 %%%% , MYSQL中数据全被查询出来的Bug(GORM)

news/2024/12/19 6:48:21/

1.Bug 奇遇记

        在工作中遇到的一个神奇小bug. 那是一天大雪天上午 , 打开飞书 , 哦吼 , 新bug. 看到这个bug当时就感觉出来问题出在哪里了, 仔细查看后 , 坏了啊, 这一个项目基本上涉及到模糊查询的都有这个bug. 并且 , 在我之前实习的公司 , 在学校做的项目 , 全部都存在这个bug. 怎么办? 一个一个加参数校验的条件吗? 那是不可能的 , 后面和导师说明了一下情况 , 可以封装一个公共的方法 , 如果需要模糊查询 , 对这个字段做一个转义.

2. 详细解释

像如下sql语句 , 是会把全部的数据都查询出来的

select * from test_name where name like '%%%%%'

MySQL中 % 属于通配符 , 并不会被转义 , 导致查询时 , 其实和用户输入空字符串情况一样 , 查询的是全部的数据.

解决代码

// EscapeLikeToNewStr 转义 SQL LIKE 查询中的通配符,返回被 left , right 包裹的新字符串
func EscapeLikeToNewStr(left, right, word string) string {return escapeCommon(left, right, word, true)
}// EscapeLike 转义 SQL LIKE 查询中的通配符,返回原有字符串
func EscapeLike(word string) string {return escapeCommon("", "", word, false)
}func escapeCommon(left, right, word string, wrap bool) string {var n intfor i := range word {if c := word[i]; c == '%' || c == '_' || c == '\\' {n++}}// 如果没有需要转义的字符,则直接返回原始字符串if n == 0 {if wrap {return left + word + right}return word}var b strings.Builderb.Grow(len(word) + n)for _, c := range word {if c == '%' || c == '_' || c == '\\' {b.WriteByte('\\')}b.WriteRune(c)}if wrap {return left + b.String() + right}return b.String()
}

对于需要参与模糊查询的数据 , 做一次转义 . 这样 , 当用户输入 %%% 后 , 查询SQL就变成了

select * from test_name where name like '%/%/%/%%'

由于数据中并不存在名称为 %%% 的数据 , 自然就查询不出来了. OK , 这样 , 那个地方需要 , 就去调用,就可以了. 


http://www.ppmy.cn/news/1556324.html

相关文章

基于RRT(Rapidly-exploring Random Tree)的无人机三维路径规划,MATLAB代码

RRT(Rapidly-exploring Random Tree)算法是一种基于采样的路径规划方法,它通过递增地构建一棵树来探索配置空间。算法从一个初始点(通常是起点)开始,通过随机采样的方式逐步扩展树结构,直到达到…

社区生活超市系统|Java|SSM|JSP|

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…

Flutter Navigator2.0的原理和Web端实践

01 背景与动机 在Navigator 2.0推出之前,Flutter主要通过Navigator 1.0和其提供的 API(如push(), pop(), pushNamed()等)来管理页面路由。然而,Navigator 1.0存在一些局限性,如难以实现复杂的页面操作(如移…

重生之我在异世界学编程之算法与数据结构:算法复杂度介绍篇

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 时间复杂度1. 常数时间复杂度…

梳理你的思路(从OOP到架构设计)_认识EIT造形与内涵

目录 1、 认识类(Class)与内涵 2、 认识EIT造形与内涵 EIT造形: 类造形的组合​编辑 复习EIT的基本形与变形​编辑 不同内涵 EIT造形 1、 认识类(Class)与内涵 回顾 类(Class)是比较小的造形 各种不同内涵,可以透过类(Class)的形式(Form)来呈现出…

【ETCD】ETCD 架构揭秘:内部各组件概览

ETCD 的主要组件及它们之间的关联关系如下: 目录 1. Client(客户端)2. gRPC 接口3. Etcd Server Main Loop(ETCD 主循环)4. Raft(共识模块)5. Peer Etcd Nodes(ETCD 集群节点&#x…

(教程)如何在HTML网页里嵌入PDF文件?

开发者可以使用不同的标签在 HTML 中嵌入 PDF 文件&#xff0c;常见的有 <embed>、<object> 和 <iframe>。它们都能在网页应用中显示 PDF&#xff0c;但哪种方式更好&#xff1f;有没有比这更好的方式来在浏览器中显示 PDF&#xff1f; 方法 1&#xff1a;使…

C#轻松实现Winform监控文件夹变化以及监控文件新增、修改、删除、重命名等操作保姆级详细教程

文章目录 一、前言二、FileSystemWatcher 类三、FolderBrowserDialog 类四、具体操作1.设置监听文件夹2.订阅变更事件3.注意事项 一、前言 在开发应用程序时&#xff0c;我们可能会因为场景的需要&#xff0c;要对文件系统中的文件或文件夹进行实时监测&#xff0c;以便在文件…