wpdbクラスのprepare関数でSQLインジェクション対策をしよう!

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 代表取締役

PAGE BACK
お問い合わせ