ルート 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 のエラー メッセージを送る」 なので注意! エラーメッセージを非表示にする (保険的対策) • ウェブサーバでの設定例 ドキュメント内 技 術 コース 専 門 編 について 対 象 企 業 等 のウェブサイト 公 開 やシステム 運 用 にお ける 安 全 性 向 上 について 理 解 を 深 めたい 方 ポイント 主 に 企 業 ウェブに 関 連 したセキュリティ 事 故 の ケーススタディによる 脅 威 と 対 策 の 技 術 (ページ 50-60)