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

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

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 int
	for 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.Builder
	b.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.kler.cn/a/442308.html

相关文章:

  • HTML基础与实践
  • C++(二十一)
  • Matplotlib基础
  • 时序数据库TDengine 3.3.5.0 发布:高并发支持与增量备份功能引领新升级
  • JWT在线解密/解码 - 加菲工具
  • salesforce在opportunity的opportunity products页面增加一个按钮,可以批量删除products
  • Java程序员如何高效学习Spring Cloud Alibaba?
  • 【ETCD】ETCD 架构揭秘:内部各组件概览
  • 基于 SSM 和 Vue 架构的新锐台球厅管理系统:创新设计引领高效实现
  • RabbitMQ中的Publish-Subscribe模式
  • 单片机:实现教学上下课的自动打玲(附带源码)
  • 【数理统计】极限定理及抽样分布
  • python之求平面离散点集围成的面积
  • Qt 开发笔记2
  • 深度学习之循环神经网络及进化(RNN-LSTM-GRU)
  • 安防监控Liveweb视频汇聚融合平台助力执法记录仪高效使用
  • 快消品 B2B 困境与破局:基于 2+1 链动模式与 S2B2C 商城小程序的思考
  • Starting MySQL.... ERROR! The server quit without updating PID file解决方案
  • 低延迟!实时处理!中软高科AI边缘服务器,解决边缘计算多样化需求!
  • Windows生态圈:如何改变我们的数字生活
  • Linux高性能服务器编程中的TCP带外数据梳理总结
  • 如何实现对象的克隆?如何实现单例模式?
  • 利用 html_table 函数轻松获取网页中的表格数据
  • 【射频仿真技巧学习笔记】Cadence仿真nmos_rf出现SFE-1966报错的解决办法
  • KeepAlive与RouterView缓存
  • Leetcode H 指数