• BPnet
  • ビジネス
  • IT
  • テクノロジー
  • 医療
  • 建設・不動産
  • TRENDY
  • WOMAN
  • ショッピング
  • 転職
  • ナショジオ
  • 日経電子版
Networkキーワード

SQLインジェクション

2005/10/17 日経NETWORK
図 Webアプリケーションを攻撃する「SQLインジェクション」
図 Webアプリケーションを攻撃する「SQLインジェクション」
[画像のクリックで拡大表示]

 行きつけのショッピング・サイトが,不正アクセスを受けて突然閉鎖してしまった。まったく違うページが表示されるようになり,アクセスしたエンドユーザーの一部はウイルスに感染したらしい——。Webサイトにこうした被害をもたらす攻撃手法が「SQLインジェクション」である。

 SQLインジェクションとは,Webサーバーへの攻撃手法の一つである。「SQL」はデータベース操作用の言語で,「インジェクション」は「注入」という意味。つまりSQLインジェクションは,Webサーバーの背後で動くデータベースにSQLコマンドを送り込み,そのコマンドを実行させる攻撃方法を意味している。

 データベースを利用したWebサーバーは,エンドユーザーから送られてくるデータを受け取ると,それを基にSQLコマンドを作り上げる。そして,データベースにアクセスして該当する情報を引き出し,Webページを作ってユーザーに見せる。

 受け取ったデータからSQLコマンドを作成するときの変換処理は,単純なケースが多い。Webサーバー側にあらかじめ空欄のあるテンプレートを用意しておき,その空欄にWebブラウザから受け取ったデータを埋め込むといった処理が一般的だ。テンプレートには,テーブルからデータを選択させる「SELECT」や,参照するテーブル名を指定する「FROM」といった命令を記述しておく(図)。図の例でいうと,「SELECT * FROM USR WHERE ID='□';」がテンプレートだ。意味は,USRテーブルから(FROM USR),IDが「□」のもの(WHERE ID='□')の全項目を表示せよ(SELECT *)——となる。この「□」の部分にWebブラウザから送られてきた値を埋め込み,データベース管理システムに送る。

 しかし,実はここに落とし穴がある。クラッカがWebブラウザで例えば「K07' OR 'A'='A」と入力すると,Webアプリが生成するSQLコマンドの条件部分が「WHERE ID='K07' OR 'A'='A'」となり,データベースのすべてのレコードを返せという意味の指示になる。こうなると,データベースのすべての情報を取り出されてしまう。

 しかも悪いことに,SQLコマンドは「;」で区切ることで,異なる操作命令を続けて記述できる。つまり,クラッカが追加した操作命令で,Webアプリの背後のデータベースを好き勝手に操作されてしまうのだ。個人情報が抜き取られるだけでなく,勝手に注文されたり,取引残高を書き換えることも可能になる。

 SQLインジェクションを防ぐには,Webブラウザから入力された値をチェックし,SQLインジェクションのために送られてきた値をブロックする「サニタイジング」という処理を施せばよい。サニタイジングの具体的な方法には,(1)Webアプリで入力されたパラメータの長さや構成要素をチェックする,(2)SQLで特別な意味を持つ文字をチェックする,(3)SQLであらかじめ決められた変換規則に従って文字を変換する——といったものがある。

あなたにお薦め

連載新着

連載目次を見る

今のおすすめ記事

  • 【ニュース解説】

    提唱者が解説、なぜ「情報銀行」を設立するか

     GPS(全地球測位システム)データや鉄道の乗降データなど「人の動き」に関するビッグデータを解析し、防災や医療に役立つように可視化する。この一連の研究に取り組むのが柴崎亮介氏だ。個人のデータの蓄積が進めば社会はより良くなるとの考えの下、技術の研究に留まらず「情報銀行」の設立を推進する。

  • 【ニュース解説】

    デンソーは、なぜNECを選んだのか

     「浮気をするつもりはない。クルマ走行中の潜在的な危険を察知する技術を、NECが持つ人工知能(AI)を使って実用化できるよう、両社で力を合わせていきたい」。デンソーは2016年12月、NECと高度運転支援や自動運転、モノづくりなどの分野で協業すると発表した。

ITpro SPECIALPR

What’s New!

経営

アプリケーション/DB/ミドルウエア

クラウド

運用管理

設計/開発

サーバー/ストレージ

クライアント/OA機器

ネットワーク/通信サービス

セキュリティ

もっと見る