用Golang动态创建PostgreSQL表

4

我正在使用GO语言中的"database/sql"包。我想创建一个动态名称的表。

我能想到的唯一方法是-

db.Exec(`CREATE TABLE`+table_name+`;`)

但是这种方法并不安全,因为可能会存在SQL注入的问题。
有没有更好的方式来实现这个功能呢?

4个回答

5

我不会编写GO代码,但是以下代码可能是安全的,可以避免注入攻击:

tx.Prepare(`do $$ begin execute format($f$create table %I()$f$,$1); end; $$;`)

然后

stmt.Exec(table_name)

0
我们可以使用报价标识符
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.

-1

只需使用占位符,例如:

db.Exec("CREATE TABLE $1", "table_name")

wikipedia:

在大多数开发平台上,可以使用与参数一起工作的参数化语句(有时称为占位符或绑定变量),而不是将用户输入嵌入语句中。占位符只能存储给定类型的值,而不能存储任意SQL片段。因此,SQL注入将被视为奇怪(并且可能无效)的参数值。


4
以上述声明为例,占位符只能存储给定类型的值,而不能存储任意的 SQL 片段。 在此情况下,table_name 不是一个值。 出现错误信息: pq: syntax error at or near "$1". - Shubham Chaudhary

-1

就像@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")

阅读原始文档,并查看其示例以便更清楚地理解。


2
这也会出错 - pq: 在 "$1" 附近有语法错误。 - Shubham Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接