何かと便利なプレペアードステートメント。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 件のコメント:
コメントを投稿