TOP › UX用語 › SQLインジェクション
テクノロジー・技術

SQLインジェクションSQL Injection

データベースへの命令を入力で書き換え、不正に利用する攻撃

SQLインジェクションとは、入力欄などに命令の一部となる文字列を送り、データベースへの命令を書き換えて、不正に利用する攻撃である。

たとえば、ログイン画面で入力した利用者名とパスワードを、そのまま命令文につなぐ作りを考える。この作りでは、利用者名に特定の記号を含めることで、パスワードを知らなくてもログインできる場合がある。

利用者名の入力で命令が変わる

ログイン画面で利用者名を入力すると、アプリケーションはその文字を使ってデータベースへの命令文を組み立てる。この命令文を「SQL文」と呼ぶ。組み立て方に問題があり、入力を命令の一部として扱う弱点が「SQLインジェクションの脆弱性」である。

ログイン画面の例では、利用者名に wiener、パスワードに bluecheese を入力すると、アプリケーションは次の命令文で照合する。これは、利用者名とパスワードの両方が一致する利用者を探す処理である。

SELECT * FROM users
WHERE username = 'wiener' AND password = 'bluecheese'

ところが、利用者名に administrator’– を入力し、パスワードを空欄にすると、アプリケーションが組み立てる命令文は次のようになる。

SELECT * FROM users
WHERE username = 'administrator'--' AND password = ''
利用者名の入力で命令が変わるのイメージ

この例では、’ が利用者名の入力の終わりを示す。データベースはその後ろを命令として読み、– 以降を注釈として読み飛ばす。そのため、データベースはパスワードの条件を確認しない。その結果、攻撃者はパスワードなしで、その利用者としてログインできる。

語源・提唱者

Jeffジェフ Forristalフォリスタルは、1998年12月にサーバーへの攻撃方法を記した文章の中で、SQLインジェクションについて説明した。

情報の漏えいや改ざんに及ぶ

先ほどのログイン例では、攻撃者が本人確認をすり抜け、不正にログインする。SQLインジェクションによる被害には、このほかに、非公開情報や個人情報の読み取り、情報の書き換えや消去がある。データベースを停止するなどの操作につながる場合もある。

情報の漏えいや改ざんに及ぶのイメージ

2009年、米司法省は、カード決済処理会社などにSQLインジェクション攻撃で侵入し、1億3,000万件超のクレジット・デビットカードのデータを盗んだとして男を起訴した。

設計時に入力の渡し方を確かめる

開発者は、ログイン画面を作る際に入力の渡し方を確認し、入力を命令文へ直接つながず、命令の骨組みと値を分けて渡す設計にする。この方法を「パラメータ化した問い合わせ」と呼び、SQLインジェクションのほとんどを防げる。

値を分けて渡すと、アプリケーションが命令の骨組みを先に用意し、値を後から結びつける。渡された値に命令として読める記号が含まれていても、データベースはその値を命令ではなくデータとして扱う。そのため、アプリケーションは先ほどのログイン画面でも、入力によってパスワードの条件が書き換わるのを防げる。

設計時に入力の渡し方を確かめるのイメージ

併せて、万一に備えた保険の対策として、アプリケーションがデータベースを利用するためのアカウントには、必要な操作だけを許可する。また、データベース関連のエラーメッセージを利用者の画面に表示しないようにする。

この方法で防げるのは、入力による命令の書き換えまでである。アプリケーションは、ログインした利用者が他人の情報を見てよいか、といったアクセスの可否を別に判断する必要がある。

関連用語

  • クロスサイトスクリプティング
  • 不正アクセス
  • 認可
  • プレースホルダ
  • 最小権限の原則

プロンプトインジェクション

「UX用語」のカテゴリー