Go言語でINSERT文を書く時、直接user_idやpriceなどの変数を構文中に入れるとデータを消去されたり改変される危険性がある。
これをSQLインジェクションと呼ぶ。
SQLインジェクションを阻止するための方法にプリペアドステートメントがある。
例として、下記のようなコードを記載する.
package main import ( "database/sql" "log" _ "github.com/mattn/go-sqlite3" ) func main() { db, err := sql.Open("sqlite3", "sample.db") if err != nil { log.Fatal(err) } user_id := 10 price := 10000 s := "INSERT INTO orders(user_id,price) VALUES(?,?);" stmt, err := db.Prepare(s) if err != nil { log.Fatal(err) } _, err := stmt.Exec(user_id, price) if err != nil { log.Fatal(err) } }
今までだと、s := "INSERT INTO orders(user_id,price) VALUES(" 10","10000");で記載していたのを、VALUESの後を(?,?)に変更する。そのあと、プリペアードステートメントでdb.Prepare(s), stmt.Exec(user_id, price)する。
stmt.Execの()内は、文字に変換せず、そのまま数字を入れることができる。
関連記事