1
0

More than 1 year has passed since last update.

SQLインジェクションを防ぐ 〜3

Last updated at Posted at 2021-11-21
SQLコードインジェクション防止の8のベストプラクティス

第3章です。

序章
1. クライアントサイドの入力バリデーションに依存しない
2. 制限された権限を持つデータベースユーザーを使用する
3. プリペアドステートメントとクエリパラメータ化を使用する
4. コードをスキャンしてSQLインジェクションの脆弱性を探す
5. ORMレイヤーを使用する
6. ブロックリストに依存しない
7. 入力バリデーションを行う
8. ストアドプロシージャに注意する

チートシート(英語)はこちら

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

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0