情報セキュリティの基礎
SQLインジェクションへの対策として、プレースホルダを使うプリペアドステートメント(パラメータ化クエリ)が、入力の中の危険な文字を取り除く方法より根本的な対策とされる理由として正しいものはどれか。
- A入力を暗号化してからデータベースに渡すので、攻撃者に中身を読まれないから
- Bブラウザの側で入力の文字の種類を確かめるので、サーバに不正な文字列が届かなくなるから
- CSQL文の構造を先に確定させ、入力はあとから値としてだけ渡すので、入力にどんな文字が含まれていても命令の一部として解釈されないから
答えと解説を見る
正解:C. SQL文の構造を先に確定させ、入力はあとから値としてだけ渡すので、入力にどんな文字が含まれていても命令の一部として解釈されないから
プリペアドステートメントでは、まず「SELECT … WHERE id = ? AND password = ?」のように、値の部分を記号(プレースホルダ)にしたSQL文をデータベースに渡して構造を確定させ、そのあとで入力を値としてだけ結び付けます(バインド)。入力は最初から最後までデータとして扱われるので、引用符などが含まれていても、条件を付け加えるような命令の一部にはなりません。入力から危険な文字を取り除いたりエスケープしたりする方法は、データベースの種類や文字コードごとの細かい規則を漏れなく扱う必要があり、1か所でも漏れると攻撃が成り立ちます。また、ブラウザ側での入力のチェックは、攻撃者がブラウザを通さずに直接リクエストを送れば回避されるので、利便性のためのものであり、セキュリティの対策にはなりません。これに加えて、データベースに接続するアカウントの権限を最小にしておくと、被害を小さくできます。
- A. プリペアドステートメントは入力を暗号化するものではありません。値とSQL文の構造を分けて扱うことが要点です。
- B. ブラウザ側のチェックは、攻撃者が直接リクエストを送れば回避できるので、対策になりません。
- C. 正しい。文の構造を先に固め、入力は値としてだけ扱うので、命令として解釈されることがありません。