2007年7月11日水曜日

MySQLのプレペアードステートメントはメモリレベルか?

 何かと便利なプレペアードステートメント。SQLにプレースホルダーとして"?"などを埋め込んで、実行時にベット渡したパラメータを代入(バインド)してくれるプレペアードステートメント。MS系ではパラメータ(ライズド)クエリーと呼ばれることが多いプレペアードステートメント。パフォーマンスの向上や実行時エラーの検出よりもSQLインジェクション対策として重宝する。
 しかし、プレースホルダーへのパラメータの代入がメモリレベルで行われていなければ、SQLインジェクションの根本的解決とはならない。有名な例では、PHPのPEAR::DBではプレペアードステートメントっぽく見えるけど実際にはDBに渡る前にパラメータがSQLの一部に埋め込まれてDBに渡されるので、場合によってはSQLインジェクションが可能だ。

 それでは、メモリレベルでのプレペアードステートメントが可能なDBってどれだろう?これについての情報がかなり少ないのだが、たまたまMySQL5.0ではメモリレベルでのプレペアードステートメントが行われるということを知った。

IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第6章 入力対策:SQL注入: #1 実装における対策

 逆に言えばMySQL4以前はメモリレベルでバインドされていないということ。使うとしたらちょっと嫌だなあ。

関連記事:
 MySQLのデフォルトのストレージエンジンがInnoDBになる
 MySQLでURLからドメイン部分を抜き出す方法
 MySQL Query Browser がとても便利
 PostgreSQLのUPDATEの実態と、MySQLを早くする方法

0 件のコメント:

ブログ アーカイブ

tags