我正在使用" database / sql"包中GO。我想创建一个变量名表。
我能想到的只有 -
db.Exec(`CREATE TABLE`+table_name+`;`)
但由于可以进行SQL注入,因此不安全。
答案 0 :(得分:1)
我不在GO中编码,但这可能对注射安全:
tx.Prepare(`do $$ begin execute format($f$create table %I()$f$,$1); end; $$;`)
然后
stmt.Exec(table_name)
答案 1 :(得分:1)
只需使用占位符:
db.Exec("CREATE TABLE $1", "table_name")
对于大多数开发平台,可以使用与参数一起使用的参数化语句(有时称为占位符或绑定变量),而不是在语句中嵌入用户输入。占位符只能存储给定类型的值,而不能存储任意SQL片段。因此,SQL注入将被简单地视为一个奇怪的(可能是无效的)参数值。
答案 2 :(得分:0)
就像@Vao Tsun说的那样:
stmt, err := db.Prepare("CREATE TABLE $1")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
result, err := stmt.Exec("DB_NAME_HERE")
浏览原始documentation并查看他们的示例,以便清楚了解。
答案 3 :(得分:0)
我们可以使用 QuoteIdentifier
db.Exec(fmt.Sprintf("CREATE TABLE %s", pq.QuoteIdentifier(table)))
这是文档中的几行 -
QuoteIdentifier quotes an "identifier" (e.g. a table or a column name) to be
used as part of an SQL statement.
For example:
tblname := "my_table"
data := "my_data"
quoted := pq.QuoteIdentifier(tblname)
err := db.Exec(fmt.Sprintf("INSERT INTO %s VALUES ($1)", quoted), data)
Any double quotes in name will be escaped.
The quoted identifier will be case sensitive when used in a query.
If the input string contains a zero byte, the result will be truncated immediately before it.