Posted at

【備忘録・超コネタ】WordPress でSQLインジェクション対策

More than 3 years have passed since last update.

結論、esc_sql() あるいは、wpdb::prepare()を使えということでした。

今回調べたきっかけとしてはリクエストパラメータが配列でやってきて、in 演算子でつなげる必要があり、プレースホルダが使いにくい状況でした。

ならば、個別にエスケープしてつなげようと考えたのですが、mysql_real_escape_string()は非推奨だからダメとか、代替はmysqli クラスの利用が前提だったりで、結局 WordPressのAPIに行き着いた次第です。

「エスケープって、DB接続のAPIに依存する話か、、?文法じゃね?」と思ったけど言われてみればそうかという気もしなくもありません。ライブラリがDBにまつわること一切について面倒見るという設計ならば、エスケープもそうすべきかと。ちなみに、esc_sql()は内部でwpdbクラスの_escape()を呼んでいるようです。単なる関数からでも結局DB接続APIに委譲されるようですね。

なので同じPHPでも、環境やフレームワークやライブラリが違えばこういうことも違ってくるのかなと考えた次第。MediaWikiの拡張機能を自前でつくるとか。