使用 fmt 防止 Go 中的 sql 注入。用于本机查询的 Sprintf

prevent sql injection in Go with fmt.Sprintf for native query

提问人:srx lnx 提问时间:9/1/2020 更新时间:9/3/2020 访问量:636

问:

此查询是否使SQL注入或查询插入语句不好

    query := fmt.Sprintf("INSERT INTO users(%s) VALUES(%s) RETURNING user_id, otp",
        repo.getColumns(), // returning users columns
        repo.setValues(), // looping to create $1, $2 (depent length of users columns)
    )
    stmt, err := db.Prepare(query)
    checkError(err)
    defer func() {
        if err = stmt.Close(); err != nil {
            panic(err.Error())
        }
    }()
    err = stmt.QueryRowContext(ctx,
        user.Email,
        user.CardID,
        user.CardFee,
        user.PhoneNumber,
        user.Gender,
        user.BirthDate,
        user.BirthCityID,
        user.Education,
        user.MotherName,
        user.MotherPhone,
        user.PartnerPhone,
        user.FamilyCardNumber,
        user.Religion,
        user.CitizenShip,
        user.MaritalStatus,
        user.SpouseCardID,
        user.SpouseFullName,
        user.SpouseBirthDate,
    ).Scan(&userData.ID, &userData.CardID)

这是一个返回用户列字符串的方法,是一个字符串操作,用于创建 $1、$2、....从方法上的用户列的长度来看,它会潜在安全吗?alos on the QueryRowContext 参数 second 等等......是的,如果我有很多列,我应该一个接一个地输入手动,这是为了让它更短吗?repo.getColumns()setValues()getColumns()...interface{}

数据库 go 准备语句 sql 注入

评论

0赞 mkopriva 9/1/2020
是的,存在 SQL 注入的潜力。但是,漏洞的严重性取决于插入到查询字符串中的数据的可信度。
0赞 srx lnx 9/1/2020
如何纠正方法和好写查询?对于我的情况@mkopriva

答:

-1赞 Valentin Krasontovitsch 9/3/2020 #1

sql 注入攻击的可能性在于函数调用和 返回的值。repo.getColumns()repo.setValues()

问题是你对这些函数返回的内容有多少控制权?他们的行为是否基于用户输入?如果是这样,那么你可以通过做一些简单的模式缓存来保护自己免受注入攻击 - 例如,如果你需要一个名称,请检查输入是否只由字母和空格组成。

还可以尝试排除任何可用于注入攻击且不应作为值列名称一部分的特殊符号。

...如果我有很多列,我应该一个接一个地输入手动,这是为了让它更短吗?

我建议就此单独提出一个问题,因为这是一个独特的问题。