From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- files/ja/glossary/sql_injection/index.html | 71 ++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 files/ja/glossary/sql_injection/index.html (limited to 'files/ja/glossary/sql_injection/index.html') diff --git a/files/ja/glossary/sql_injection/index.html b/files/ja/glossary/sql_injection/index.html new file mode 100644 index 0000000000..411ba6a250 --- /dev/null +++ b/files/ja/glossary/sql_injection/index.html @@ -0,0 +1,71 @@ +--- +title: SQL Injection (SQLインジェクション) +slug: Glossary/SQL_Injection +tags: + - Glossary + - Security + - Sql + - Sql Injection + - Webapp +translation_of: Glossary/SQL_Injection +--- +

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

+ +

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)
+ +

(1) によって、入力文字内のシングルクォート (') はダブルクォート (")に置換されて、(2) によって、すべての (') の前に (/)が追加されます。改訂された魔法の文字列は、認証回避に失敗して、データベースは安全なままに保たれています。

+ +

関連項目

+ +

一般知識

+ + -- cgit v1.2.3-54-g00ecf