🔒

IPA 安全なウェブサイトの作り方~SQL インジェクション~

2022/11/06に公開

こちらを読んでます
https://www.ipa.go.jp/files/000017316.pdf

SQL インジェクション

SQL インジェクション対策としての根本解決5本が以下。

1. SQL 文の組み立ては全てプレースホルダで実装する。

今までプレースホルダでしか実装したことなかったからそれ以外にあるんだ、と思っていたけど

'select id from users where name =' + arg

みたいな感じで連結させてクエリ作るやり方があるっぽい
※プリペアドステートメントとは、プログラム上で動的にSQL文を生成する必要があるとき、可変部分を変数のようにしたSQL文をあらかじめ作成しておき、値の挿入は処理系に行わせる方式。 実行効率を向上させ、SQLインジェクションを防止する効果がある。
動的プレースホルダと静的プレースホルダがあるらしいけど違いはこちらの記事がわかりやすかった。
https://qiita.com/7968/items/7ddd59b94eb5a4fb6eaf

2. SQL 文の組み立てを文字列連結により行う場合は、エスケープ処理等を行うデータベースエンジンの API を用いて、SQL 文のリテラルを正しく構成する。

  • stringを渡すときはシングルクオートで囲むが、そのシングルクオートをエスケープする。
    'name'→''name''
  • 数値は数値型にキャストする
    など
  • 外部からの入力の影響を受ける値のみに限定して行うのではなく、SQL 文を構
    成する全てのリテラル生成に対して行うべきで

3. ウェブアプリケーションに渡されるパラメータに SQL 文を直接指定しない。

hidden パラメータ等に SQL 文をそのまま指定するという事例の届出があった
hiddenパラメーターとは
https://style.potepan.com/articles/20561.html

4. エラーメッセージをそのままブラウザに表示しない。

エラーメッセージの内容に、データベースの種類やエラーの原因、実行エラーを起こした SQL 文等の情報が含まれる場合、これらは SQL インジェクション攻撃につながる有用な情報となりえる

5. データベースアカウントに適切な権限を与える。

ウェブアプリケーションからデータベースに渡す命令文を洗い出し、その命令文の実行に必要な最小限の権限をデータベースアカウントに与える。

Discussion