SQL Injection (SQLインジェクション)

この翻訳は不完全です。英語から この記事を翻訳 してください。

SQLインジェクションは悪意のあるSQLコマンドをWebアプリケーションに渡し、バックエンドのデータベースにそれを実行させる攻撃手法です。この攻撃はユーザからの入力の検証が十分でない・行っていないWebアプリケーションに対して利用されます。

SQLインジェクションはデータベースへの不正アクセスを行ったり、データベースから直接情報を取得することが可能です。 多くのデータ侵害はSQLインジェクションによるものです。

攻撃動作

UsernameとPasswordを入力した後、GUIの裏では次のSQLクエリが実行されます。

"SELECT Count(*) FROM Users WHERE Username=' " + txt.User.Text+" ' AND Password=' "+ txt.Password.Text+" ' ";

例えばユーザがUsernameに"admin"、Passwordに"passwd123"を入力し、Log inボタンをクリックします。すると以下のSQLクエリが実行されます。

"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' passwd123 ' ";

入力した認証情報が正しければユーザはログインが許可されます。このようにとてもシンプル(にして脆弱)な構造です。攻撃者はこの脆弱な構造を使って不正アクセスを行います。

攻撃者は下記のようなシンプルな魔法の文字列を入力します。

Username: admin

Password: anything 'or'1'='1

そしてlog inボタンをクリックすると、以下のSQLクエリが実行されます。

"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";

上記のクエリのPassword部分をよく見てみましょう。

Password=' anything 'or'1'='1 '

 

パスワードは"anything"ではないので、Password='anything'の結果は偽になります。ですが'1'='1'は真になります。そしてOR演算子によって、(偽 OR 真)は真になります。結果としてうまく認証を回避できてしまいました。このような単純な文字列(魔法の文字列)によって、データベース全体が危険にさらされます。

対策

ユーザの入力からSQLクエリを実行する前に、ユーザの入力に以下のような変更を加えてみましょう。

$id = $_GET['id'] 

(1) $id = stripslashes($id)

(2) $id = mysql_real_escape_string($id)

So due to (1) each single quote (') in the input string is replaced with double quotes ("), and due to (2) before every (') it adds (/). The revised magical string fails to bypass the authentication, and your database stays secure.

詳細情報

一般知識

ドキュメントのタグと貢献者

このページの貢献者: takubokudori
最終更新者: takubokudori,