如何利用通配符构造语句查询数据库?

举报
TSINGSEE青犀视频 发表于 2021/10/28 14:42:12 2021/10/28
【摘要】 首先我们要明确一下字符的使用机制,使用ESCAPE关键字定义转义符(通用)在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符。例如,要搜索在任意位置包含字符串 5% 的字符串,请使用:WHERE ColumnA LIKE ‘%5/%%’ ESCAPE ‘/’。

EasyCVR作为视频协议融合平台,除了支持RTSP、GB28181等大众协议外,还支持海康SDK、大华SDK等私有协议,如今我们也支持了阿里的上云协议。在不久后,我们将把行人分析、车牌识别、人脸识别等功能都融入至EasyCVR平台。

在EasyCVR开发中,EasyCVR利用通配符构造语句查询数据库,从而导致拒绝服务等问题。

我们调用接口进行了测试,调取设备查询接口q字段加入 % 通配符会导致服务关闭失去链接。
http://127.0.0.1:18000/api/v1/channels?device=2&start=0&limit=24&q=%

首先我们要明确一下字符的使用机制,使用ESCAPE关键字定义转义符(通用)在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符。例如,要搜索在任意位置包含字符串 5% 的字符串,请使用:WHERE ColumnA LIKE ‘%5/%%’ ESCAPE ‘/’。

在方括号 ([ ]) 中只包含通配符本身,或要搜索破折号 (-) 而不是用它指定搜索范围,请将破折号指定为方括号内的第一个字符。例如:

所以在此问题中,对输入参数的关键字过滤后,还需要做下面转换确保LIKE的正确执行,代码参考如下:

private static string ConvertSqlForLike(string sql)
{
sql = sql.Replace("[",
"[[]");
// 这句话一定要在下面两个语句之前,否则作为转义符的方括号会被当作数据被再次处理
sql = sql.Replace("_",
"[_]");
sql = sql.Replace("%",
"[%]");
returnsql;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。