Golang Go语言中数据库 like 参数用拼接会有隐患吗?
Golang Go语言中数据库 like 参数用拼接会有隐患吗?
router.POST("/post", func(c *gin.Context) {
keyword := c.Query(“keyword”)
keyword="%"+keyword+"%"
rows, err := db.Query(SELECT * From user where name like ?
,keyword)
伪代码,请见谅。
问题:这样拼接 like 参数(主要是加通配符),会有注入风险吗?
最佳实践是什么?
更多关于Golang Go语言中数据库 like 参数用拼接会有隐患吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
肯定的咯,一般都是把 keyword 再加一层双引号
更多关于Golang Go语言中数据库 like 参数用拼接会有隐患吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
参数化查询了解一下
不用 preparedstatement 避免不了
一般都是走预编译吧。
不放心就加一层参数检验正则就行。
又想了一下,如果 keyword 里本来就有 % 似乎查到的就不是想要的了。
keyword 这个起码可以在前端搞定,差不到只是涉及到对不对而已,这个后端关注的应该是安全性多一些。
应该是没有问题,但是实际上还是应该做,去除控制字符,并且分词然后查询
没问题 你的 sql 里面已经有"?"占位符了……客户端会做预编译的
注入不会。不过要考虑索引问题,
keyword 本身还要做%和_的转义吧。
感谢楼上所有老铁。
如果只是想查询是否包含给定的 keyword,可以试下用 DB 提供的字符串查找 SQL 函数,比如 strpos。性能会好些,另外不用担心转义的问题。
在Golang中使用数据库查询时,直接将参数拼接到SQL语句中(类似于SQL中的LIKE子句)确实存在安全隐患,主要是SQL注入攻击的风险。这种风险来源于恶意用户可以通过输入特殊字符或SQL片段来篡改原SQL语句的逻辑,进而执行未授权的数据库操作。
为了避免这种风险,推荐使用参数化查询(prepared statements)来处理SQL语句中的变量部分。Go语言的标准库database/sql
支持参数化查询,它允许你使用占位符(如?
或$1
, $2
等,具体取决于使用的数据库驱动)来代表变量,并在执行时传递这些变量的实际值。
对于LIKE子句,你可以在传递参数时对通配符(如%
和_
)进行适当的处理,然后将处理后的参数绑定到SQL语句中。这样做既能保持查询的灵活性,又能有效防止SQL注入。
示例代码(以MySQL为例):
query := "SELECT * FROM users WHERE username LIKE ?"
likeValue := "%" + userInput + "%"
rows, err := db.Query(query, likeValue)
if err != nil {
// 错误处理
}
defer rows.Close()
// 处理查询结果
总之,直接在SQL语句中拼接参数是不安全的做法,应始终使用参数化查询来避免SQL注入风险。