微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

防止在beego中进行SQL注入

如何解决防止在beego中进行SQL注入

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

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_namelast_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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。