wpdbクラスのprepare関数でSQLインジェクション対策をしよう!
前回に引き続きwpdbクラスの関数の説明をしていきたいと思います。
以前の記事ではwpdbクラスで抽出するための関数を紹介しました。
今回はそのwpdbクラスを使用して抽出した際に気をつけなければいけないSQLインジェクション対策を行える関数の紹介をします。
そもそもSQLインジェクションとは?
まず初めに、SQLインジェクションとは何かを簡単に説明したいと思います。
SQLインジェクションとは不正なSQL文を実行することによりデータベースを不正に操作し攻撃することです。
SQLインジェクション対策をしていなければデータを勝手に削除されたり変更されたりする可能性があります。
では、実際にSQLインジェクション対策とは何をすればいいのでしょうか?
今回はwpdbクラスのSQLインジェクション対策を紹介します。
wpdbクラスのprepare関数
wpdbクラスにはSQLインジェクション対策に必要なプリペアドステートメントが用意されています。
関数名はprepareで、prepare関数ではプレースホルダが使用できます。
プレースホルダとして指定された値は、エスケープされSQL文中で値としてのみ扱われるようになります。
実際には下記のように記述します。
$sql = “SELECT * FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s;
$query = $wpdb->prepare( $sql, 1, “PHP” );
$results = $wpdb->get_results( $query );
では説明いたします。
WHERE句に指定しているpost_idはint型なので%d、meta_keyはstring型なので%sとなります。
数値は%d、文字列は%sとすると覚えてしまいましょう。
そして次の行のprepare( $sql, 1, “PHP” )の部分ですが、これは第一引数にsqlを渡し、第二引数以降に%dや%sに渡す値を指定します。
あとは前回の記事で述べたように取得するだけです。
まとめ
今回、SQLインジェクション対策にprepare関数を説明しましたが、この一手間が非常に重要になります。
実際にデータベースを不正に操作されれば大問題です。
プリペアドステートメントを実装するだけでなく万が一に備え、データベースのバックアップを定期的にとるようにもしましょう。
この記事を書いた人
大西照
株式会社Esolab 代表取締役