防止SQL注入beego
Prevent SQL injection in beego
我正在使用 select 查询通过以下代码从我的 table 中获取一些行。
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, 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+"%", srch)
}
_, err = o.Raw(q, args...).QueryRows(&l)
return
}
或使用 mysql 的 CONCAT
:
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 CONCAT('%', ?, '%') OR LOWER(last_name) LIKE CONCAT('%', ?, '%') OR id = ?)`
args = append(args, srch, srch, srch)
}
_, err = o.Raw(q, args...).QueryRows(&l)
return
}
我正在使用 select 查询通过以下代码从我的 table 中获取一些行。
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, 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+"%", srch)
}
_, err = o.Raw(q, args...).QueryRows(&l)
return
}
或使用 mysql 的 CONCAT
:
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 CONCAT('%', ?, '%') OR LOWER(last_name) LIKE CONCAT('%', ?, '%') OR id = ?)`
args = append(args, srch, srch, srch)
}
_, err = o.Raw(q, args...).QueryRows(&l)
return
}