SQLインジェクションは、Webサイトにリクエストを送るHTTPのパラメータにSQLの命令を含ませることで、SQLを採用しているデータベースに直接アクセスして不正操作を行う攻撃手法のことです。
正常なログインで実行されるSQL文を確認します。下図では顧客テーブルに格納された情報から、指定した名前とパスワードに合致する顧客情報をすべて返す構文です。*(アスタリスク)は該当するすべての情報を表します。また、鈴木と123456は、'鈴木' や'123456'という風に、文字列をシングルクォーテーションで囲います。この結果として、鈴木さんの顧客情報が返ってきます。
次にSQLインジェクションの構文は下図です。ここで、名前の検索条件を見ると、''(シングルクォーテーション)がふたつ入ります。これは、名前が空ということになります。続いてor(もしくは)が入ります。そして、次に 1=1 が入ります。これを合わせると、名前の検索条件は、「空もしくは1=1」となります。1=1は当たり前です。そのあとに続く、--はコメントと認識され、後の条件は無視されます。したがって、このSQL文はすべての顧客情報を選択することとなります。
SQLインジェクションの対策としては、安全なWebアプリケーションを開発することが必要です。以下がSQLインジェクション攻撃への根本的な解決策となります。
- プレースホルダを利用する
- エスケープ処理を行う
- Webアプリケーションに渡されるパラメータにSQL文を直接指定しない
SQLインジェクション攻撃を防ぐ方法はどれか。
~「基本情報技術者・平成25年春期」より
ア | 入力中の文字がデータベースへの問合せや操作において,特別な意味をもつ文字として解釈されないようにする。 |
イ | 入力にHTMLタグが含まれていたら,HTMLタグとして解釈されない他の文字列に置き換える。 |
ウ | 入力に,上位ディレクトリを指定する文字(../)を含むときは受け付けない。 | エ | 入力の全体の長さが制限を超えているときは受け付けない。 |
答え:ア
エスケープ処理を行うことで、SQLインジェクションを受けた際に、攻撃コードの中の特定の文字列や記号を削除したり置き換え、攻撃を無効化できます。イ:クロスサイトスクリプティング(XSS)を防ぐ方法です。ウ:ディレクトリトラバーサル攻撃を防ぐ方法です。エ:バッファオーバフロー攻撃を防ぐ方法です。