• 検索結果がありません。

ルート DNS サーバ

A. DNS.JP. が知っています

3. 複数のコンテンツサーバの応答が一致しない

2.2 SQL インジェクション対策

バインド機構を利用 (例: Perl DBI)

• 変数と関係なく構文解釈を行うため、

SQLインジェクションはありえない

$sth = $dbh->prepare(

"SELECT id, name, tel, address, mail FROM usr WHERE uid=? AND passwd=?");

$sth->execute($uid, $passwd);

プレースホルダ バインド変数

参考:セキュア DB プログラミング「バインドメカニズムを活用しよう」

http://www.ipa.go.jp/security/awareness/vendor/programmingv1/a02_01.html

バインド機構を利用 (例: Java)

String parameter = ユーザが入力した値 ;

Connection c = データベース接続オブジェクトの取得 ;

// 値を埋め込む前の形の SQL 文をコンパイルし、構文を確定

PreparedStatement st = c.prepareStatement("SELECT name, price FROM product_table WHERE code=?");

st.setString(1, parameter); // ? の場所に値を埋め込む ResultSet rs = st.executeQuery(); // クエリの実行

http://www.ipa.go.jp/security/awareness/vendor/programmingv2/web02.html よ り引用。

参考:: http://www.thinkit.co.jp/cert/tech/7/5/3.htm

バインド機構を利用

(例: PostgreSQL+PHP)

<?php

String parameter = ユーザが入力した値;

$dbc = pg_connect("dbname=pg_db"); // データベース接続 // 値を埋め込む前の形のSQL文をコンパイルし、構文を確定

$result = pg_prepare($dbc, "query1", 'SELECT name, price FROM product_table WHERE code=$1');

// $1の場所に値を指定してクエリの実行

$result = pg_execute($dbc, "query1", array(parameter));

?>

http://www.ipa.go.jp/security/awareness/vendor/programmingv2/web02.html よ り引用。

参考: http://www.phppro.jp/phpmanual/php/function.pg-prepare.html

エスケープ処理 (根本的解決)

• エスケープ処理の実施。

特別な意味を持つ記号文字が普通の文字として解 釈されるように処理する。

例:' → ''(同じ文字の繰り返し)

$p=foo' or 'a'='a の場合:

SELECT * FROM a WHERE id='foo'' or ''a''=''a';

変数中の ‘(シングルクォート)が、普通の文字として

解釈される。

同様に、バックスラッシュ’¥’にも繰り返しによるエス

ケープ処理が必要な場合がある。

実際のエスケープ処理

• エスケープ関数

( Perl の DBI quote() や PHP の dbx_escape_string() )

• 置き換え演算子等で自己エスケープ処 理

( s/'/''/g; など)

– 対策洩れが生じやすい方法

エスケープ処理以前の問題 (根本的解決)

• 外部から SQL 文を直接入力する。

• 「論外」であり、避けるべき実装である。

<html>

<form>

<input type="hidden" value="SELECT * FROM ...">

</form>

エラーメッセージを表示すると・・・

• 攻撃者の視点では、こう見える

– データベースを利用 →SQL インジェクションの可能性。

– SQL エラーに気を使っていない → 攻略の可能性。

– エラー内容に SQL 文が含まれる → レコード定義が推測で きる & 試行錯誤すればどんどん調査できる可能性。

– エラー内容から攻略方法を検討・・・。

■名前: 悪人 太郎 SQL error with query SELECT a.name, a.displname, a.passwd, a.expire_date, a.create_date, a.misc FROM account as a WHERE a.category=7 ORDER BY c.date:

Can't open file: „account.MYD'. (errno: 145)

■趣味: クラッキング

エラーメッセージを非表示にする

(保険的対策)

• ウェブアプリケーションで対応。

– アプリケーションでエラーメッセージ表 示処理を用意して、それを呼び出す。

• データベースの設定で対応。

– 設定で変更。

• ウェブサーバの設定で対応。

– 設定でエラー時の応答を設定。

エラーメッセージを非表示にする

(保険的対策)

• ウェブサーバでの設定例

– Microsoft IIS 6

• この設定で、 ASP のエラーは全て置き換えられる。

※ デフォルト値は

「クライアントに詳細 な ASP のエラー メッセージを送る」

なので注意!

エラーメッセージを非表示にする

(保険的対策)

• ウェブサーバでの設定例

関連したドキュメント