我正在使用GO语言中的"database/sql"包。我想创建一个动态名称的表。
我能想到的唯一方法是-
db.Exec(`CREATE TABLE`+table_name+`;`)
但是这种方法并不安全,因为可能会存在SQL注入的问题。
有没有更好的方式来实现这个功能呢?
我正在使用GO语言中的"database/sql"包。我想创建一个动态名称的表。
我能想到的唯一方法是-
db.Exec(`CREATE TABLE`+table_name+`;`)
但是这种方法并不安全,因为可能会存在SQL注入的问题。
有没有更好的方式来实现这个功能呢?
我不会编写GO代码,但是以下代码可能是安全的,可以避免注入攻击:
tx.Prepare(`do $$ begin execute format($f$create table %I()$f$,$1); end; $$;`)
然后
stmt.Exec(table_name)
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.
只需使用占位符,例如:
db.Exec("CREATE TABLE $1", "table_name")
在大多数开发平台上,可以使用与参数一起工作的参数化语句(有时称为占位符或绑定变量),而不是将用户输入嵌入语句中。占位符只能存储给定类型的值,而不能存储任意SQL片段。因此,SQL注入将被视为奇怪(并且可能无效)的参数值。
就像@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")
阅读原始文档,并查看其示例以便更清楚地理解。
pq: 在 "$1" 附近有语法错误。
- Shubham Chaudhary
pq: syntax error at or near "$1".
- Shubham Chaudhary