<< 購読者が定めたスケジュール通りに RSS で配信する「feed magazine」 | メイン | HAVING句の力(SQL, HAVING, 関係除算) >>
2006年11月02日
今夜分かるSQLインジェクション対策
Webアプリケーションに対する攻撃手法の1つであるSQLインジェクションの存在は、かなり広く知られるようになった。しかし、その対策はまだ本当に理解されていないように思える。フォームから渡された値の特殊文字をエスケープしたり、PHPのmagic_quotes_gpcといった自動エスケープ機能をオンにするだけで対策したつもりになっていないだろうか。
「SQLインジェクション(injection)」とは、例えば入力フォームなどで特殊な文字列を入力することで、データベースに記録される内容を取り出したり、パスワードを知らずとも不正なログインが可能なセキュリティホールのこと。
その基本的な対策方法について説明されています。基本的に文字コードはEUC、特殊な文字などはきちんとエスケープをしていれば原則、OKです。Perlの場合はbindを用いていれば比較的かんたんに回避できちゃいます。
次の通り。
#-- SQL準備 --#
$sql = qq|select * from table where a=? and b=?|;
#-- SQLをセット --#
$sth = $dbh->prepare($sql);
#-- SQL実行 --#
$sth->execute( $a, $b );
SQL文で「?」となっている部分がexecuteで渡している値へ自動的に置き換わります。文字列の場合はシングルコーテーション(‘’)で囲まれ、まずい値は自動的にエスケープされます。またbindを使っていると、データベースにもよりますが、SQLの解析部分が省略されたりするので、動作も軽くなります。何だか良いことずくめで逆に不安ですか?(;´∀`)
bindは動作を軽くするだけだからSQL文にそのまま変数埋め込んでもいいか、といったことにならないように、お互い気をつけましょう>読んでいる方
○関連
【緊急インタビュー】SQLインジェクション攻撃に気づかない企業は山のようにある
http://itpro.nikkeibp.co.jp/free/NPC/NEWS/20050706/164102/
SQLインジェクション再現デモムービー
http://phpspot.org/blog/archives/2006/07/sql_2.html
インプレスジャパン
カテゴリー:DB
この記事のURL | コメントを書く・読む (0) | トラックバック (0)
|



















