2 回答
TA贡献1853条经验 获得超9个赞
go-sql-driver,默认情况下,CALL如果攻击者设法执行 SQL 注入(例如,通过注入0 OR 0; DROP TABLE foo),由于安全隐患,不允许您在一个查询中包含多个语句(就像您通过将多个语句链接在一起所做的那样)。
为此,您必须multiStatements在连接到数据库时通过传递参数来显式启用它,例如
db, err := sql.Open("mysql", "user:password@/dbname?multiStatements=True")来源:https : //github.com/go-sql-driver/mysql#multistatements
TA贡献1806条经验 获得超8个赞
我通过对参数进行一些手动字符串插值而不是使用正确的?方法来修复 proc 调用:
bulkSetStatus := func(docVers []*_documentVersion) error {
if len(docVers) > 0 {
query := strings.Repeat("CALL documentVersionSetStatus(%q, %q); ", len(docVers))
args := make([]interface{}, 0, len(docVers)*2)
for _, docVer := range docVers {
args = append(args, docVer.Id, docVer.Status)
}
_, err := db.Exec(fmt.Sprintf(query, args...))
return err
}
return nil
}
所以我交换了?for%q和 usfmt.Sprintf来注入参数,我应该注意到 slugonamission 的答案是部分正确的,我确实需要添加连接字符串参数multiStatements=true,以便让它与我的其他更改一起使用。我将在 github repo 上记录一个问题,当有多个语句时,它看起来可能存在一些参数插值问题,我认为发生错误是因为 mysql db 试图运行包含?文字的脚本。
- 2 回答
- 0 关注
- 173 浏览
添加回答
举报
