SQLインジェクションは、Webサイトにリクエストを送るHTTPのパラメータにSQLの命令を含ませることで、SQLを採用しているデータベースに直接アクセスして不正操作を行う攻撃手法のことです。
正常なログインで実行されるSQL文を確認します。下図では顧客テーブルに格納された情報から、指定した名前とパスワードに合致する顧客情報をすべて返す構文です。*(アスタリスク)は該当するすべての情報を表します。また、鈴木と123456は、'鈴木' や'123456'という風に、文字列をシングルクォーテーションで囲います。この結果として、鈴木さんの顧客情報が返ってきます。

次にSQLインジェクションの構文は下図です。ここで、名前の検索条件を見ると、''(シングルクォーテーション)がふたつ入ります。これは、名前が空ということになります。続いてor(もしくは)が入ります。そして、次に 1=1 が入ります。これを合わせると、名前の検索条件は、「空もしくは1=1」となります。1=1は当たり前です。そのあとに続く、--はコメントと認識され、後の条件は無視されます。したがって、このSQL文はすべての顧客情報を選択することとなります。

SQLインジェクションの対策としては、安全なWebアプリケーションを開発することが必要です。以下がSQLインジェクション攻撃への根本的な解決策となります。
- プレースホルダを利用する
- エスケープ処理を行う
- Webアプリケーションに渡されるパラメータにSQL文を直接指定しない
SQLインジェクション攻撃を防ぐ方法はどれか。
| ア | 入力中の文字がデータベースへの問合せや操作において,特別な意味をもつ文字として解釈されないようにする。 |
| イ | 入力にHTMLタグが含まれていたら,HTMLタグとして解釈されない他の文字列に置き換える。 |
| ウ | 入力に,上位ディレクトリを指定する文字(../)を含むときは受け付けない。 | エ | 入力の全体の長さが制限を超えているときは受け付けない。 |
答え:ア
SQLインジェクションは、Webアプリケーションの入力欄などにSQL文の一部となる文字列を入力し、データベースに対して不正な操作を実行させる攻撃です。対策としては、入力された文字列がSQL文の命令として解釈されないように、特別な意味をもつ記号を無効化したり、プレースホルダを用いたパラメータ化クエリなどを利用したりすることが重要です。したがって、入力中の文字がデータベース操作で特別な意味をもつ文字として解釈されないようにするアが正解です。イはクロスサイトスクリプティング(XSS)対策、ウはディレクトリトラバーサル対策、エは入力値チェックの一例ですがSQLインジェクション対策としては適切ではありません。