我正在使用选择查询,使用以下代码从表中获取一些行。

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
}
尽管我使用准备好的语句来绑定(bind)值,但对于first_namelast_name字段,它们并没有正确地转义。例如,如果srch的值为Tes't,它将中断查询。有什么办法可以转义这些值,以便在使用MySql驱动程序时可以防止SQL注入(inject)?
任何帮助深表感谢。提前致谢。

最佳答案

%通配符应位于字符串内部,而不是字符串外部,即... 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
}

关于go - 防止在beego中进行SQL注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64765502/

10-15 23:12