#####SQLコードインジェクション防止の8のベストプラクティス
https://snyk.io/blog/sql-injection-cheat-sheet/
######第3章です。
- クライアントサイドの入力バリデーションに依存しない
- 制限された権限を持つデータベースユーザーを使用する
- プリペアドステートメントとクエリパラメータ化を使用する
- コードをスキャンしてSQLインジェクションの脆弱性を探す
- ORMレイヤーを使用する
- ブロックリストに依存しない
- 入力バリデーションを行う
- ストアドプロシージャに注意する
3.プリペアドステートメントとクエリパラメータ化を使用する
多くの言語には、SQLインジェクションを防ぐための機能が組み込まれています。SQLクエリを作成するとき、プリペアドステートメントでは、クエリのパラメータ化を行うことができます。クエリのパラメータ化は、SQLステートメントを動的を作成する手法です。ベースとなるクエリをいくつかのプレースホルダーとともに作成し、ユーザーが指定したパラメータをこれらのプレースホルダーに安全にアタッチします。
実際に準備されたステートメントとパラメーター化されたクエリを使用する場合、データベース自体が実際にエスケープの処理をします。まず、プレースホルダーを含むクエリ文字列に基づいてクエリ実行プランを作成します。2番目のステップでは、(信頼できない)パラメーターがデータベースに送信されます。クエリプランはすでに作成されているため、パラメータがそれに影響を与えることはありません。これにより、インジェクションを完全に防ぐことができます。
Javaの例:
String query = "SELECT * FROM USERS WHERE username LIKE ?"; PreparedStatement statement = connection.prepareStatement(query); statement.setString(1, parameter); ResultSet result = statement.executeQuery();
MySqlコネクタを使用したPythonの例:
cursor = conn.cursor(prepared=True) params = ("foo",) cursor.execute("SELECT * FROM USERS WHERE username = %s", params)
mysql2を使用したJavaScriptの例:
`connection.query("SELECT * FROM USERS WHERE username = ?",[
req.body.username
],function(error, results){});
//emulates a prepared statement
//OR
connection.execute("SELECT * FROM USERS WHERE username = ?",[
req.body.username
],function(error, results){});
//prepared statement`
これを JavaScript で行うには、たとえば MySql データベースを使用する場合、複数の方法があります。.query()
を使用する場合には、実際にプリペアドステートメントを実行するのではないことに注意してください。パラメータの置換はクライアントサイドで処理されます。つまり、プリペアドステートメントをエミュレートしてることになります。データベース上で本物のプリペアドステートメントを実行するには、.execute()
関数を使用する必要があります。
3つめは以上です。
最後までお読みいただきありがとうございました!
######次回はSQLインジェクションを防ぐ 〜4に続きます。
SQLインジェクションに関する英語全原文はこちらです。
######Contents provided by:
Jesse Casman, Fumiko Doi, Content Strategists for Snyk, Japan, and Randell Degges, Community Manager for Snyk Global