Golang で SQL を使用する場合、SQL インジェクション攻撃を防ぐために入力データをエスケープする必要がある場合があります。 SQL インジェクション攻撃とは、ハッカーが悪意のある SQL ステートメントを構築して、データベースの削除やデータの改ざんなどの不正な操作を実行することを指します。この攻撃を防ぐには、ユーザーが入力したデータをエスケープして、入力されたデータに不正な文字が含まれていないことを確認する必要があります。
Golang には、SQL ステートメントをエスケープするために使用できるいくつかの組み込み関数が用意されています。最も一般的に使用されるのは、db.QueryEscape()
関数です。この関数は文字列引数を受け取り、エスケープされた文字列を返します。
次は、db.QueryEscape()
関数を使用したサンプル コードです。
import "database/sql" import _ "github.com/go-sql-driver/mysql" func main() { db, err := sql.Open("mysql", "user:password@/dbname") if err != nil { panic(err.Error()) } defer db.Close() var name string inputName := "Robert'; DROP TABLE students;--" err = db.QueryRow("SELECT name FROM students WHERE name=?", db.QueryEscape(inputName)).Scan(&name) if err != nil { panic(err.Error()) } fmt.Printf("The name is %s\n", name) }
上記の例は、students
テーブル内の名前をクエリします。 for Robert'; DROP TABLE students;--
students, この名前には悪意のある SQL ステートメントが含まれています。入力データがエスケープされていない場合、DROP TABLE ステートメントが実行され、テーブル全体が削除されます。ただし、db.QueryEscape()
関数を使用してエスケープするため、SQL インジェクション攻撃は発生しません。
db.QueryEscape()
関数に加えて、db.Query(fmt.Sprintf("SELECT name FROM students WHERE name ='%s'", strings.Replace(inputName, "'", "''", -1)))
、SQL ステートメントをエスケープすることもできます。ただし、この方法は面倒でエラーが発生しやすくなります。
つまり、組み込みのエスケープ関数を使用するか手動エスケープを使用するかに関係なく、入力データが安全であることを確認してください。入力データにセキュリティホールがある場合、エスケープを使用したとしてもハッカーの侵入の機会が残されてしまうためです。
以上がgolang で SQL ステートメントをエスケープする方法について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。