教程 > gorm 教程 > 阅读:45

gorm 安全——迹忆客-ag捕鱼王app官网

gorm 使用 database/sql 的参数占位符来构造 sql 语句,这可以自动转义参数,避免 sql 注入数据

注意 : logger 打印的 sql 并不像最终执行的 sql 那样已经转义,复制和运行这些 sql 时应当注意。

查询条件

用户的输入只能作为参数,例如:

userinput := "jinzhu;drop table users;"
// 安全的,会被转义
db.where("name = ?", userinput).first(&user)
// sql 注入
db.where(fmt.sprintf("name = %v", userinput)).first(&user)

内联条件

// 会被转义
db.first(&user, "name = ?", userinput)
// sql 注入
db.first(&user, fmt.sprintf("name = %v", userinput))

当通过用户输入的整形主键检索记录时,你应该对变量进行类型检查。

userinputid := "1=1;drop table users;"
// 安全的,返回 err
id,err := strconv.atoi(userinputid)
if err != nil {
    return error
}
db.first(&user, id)
// sql 注入
db.first(&user, userinputid)
// select * from users where 1=1;drop table users;

sql 注入方法

为了支持某些功能,一些输入不会被转义,调用方法时要小心用户输入的参数。

db.select("name; drop table users;").first(&user)
db.distinct("name; drop table users;").first(&user)
db.model(&user).pluck("name; drop table users;", &names)
db.group("name; drop table users;").first(&user)
db.group("name").having("1 = 1;drop table users;").first(&user)
db.raw("select name from users; drop table users;").first(&user)
db.exec("select name from users; drop table users;")
db.order("name; drop table users;").first(&user)

避免 sql 注入的一般原则是,不信任用户提交的数据。我们可以进行白名单验证来测试用户的输入是否为已知安全的、已批准、已定义的输入,并且在使用用户的输入时,仅将它们作为参数。

查看笔记

扫码一下
查看教程更方便
网站地图