问题描述
func (f *UserFilter) ListAllUsers(srch string) (cnt int64,l []*ListResp,err error) {
o := orm.NewOrm()
var args []interface{}
var w string
q := `SELECT * FROM users WHERE 1 = 1`
if srch != "" {
q += ` AND (LOWER(first_name) LIKE %?% OR LOWER(last_name) LIKE %?% OR id = ?)`
args = append(args,srch,srch)
}
_,err = o.Raw(q,args).QueryRows(&l)
return
}
尽管我使用准备好的语句来绑定值,但对于字段first_name
和last_name
,它们并不能正确地转义。例如,如果值srch
为Tes't,它将中断查询。有什么办法可以转义这些值,以便在使用MysqL驱动程序时可以防止sql注入?
我们非常感谢您的帮助。预先感谢。
解决方法
%
通配符应位于字符串的内部,而不是字符串的外部,即... LIKE %'foo'% ...
无效,... LIKE '%foo%' ...
有效。有关LIKE
的更多信息。
func (f *UserFilter) ListAllUsers(srch string) (cnt int64,l []*ListResp,err error) {
o := orm.NewOrm()
var args []interface{}
var w string
q := `SELECT * FROM users WHERE 1 = 1`
if srch != "" {
q += ` AND (LOWER(first_name) LIKE ? OR LOWER(last_name) LIKE ? OR id = ?)`
args = append(args,"%"+srch+"%",srch)
}
_,err = o.Raw(q,args...).QueryRows(&l)
return
}
或使用mysql的CONCAT
:
func (f *UserFilter) ListAllUsers(srch string) (cnt int64,err error) {
o := orm.NewOrm()
var args []interface{}
var w string
q := `SELECT * FROM users WHERE 1 = 1`
if srch != "" {
q += ` AND (LOWER(first_name) LIKE CONCAT('%',?,'%') OR LOWER(last_name) LIKE CONCAT('%','%') OR id = ?)`
args = append(args,srch,args...).QueryRows(&l)
return
}