wpdb prepare – SQL インジェクション攻撃からクエリを守ろう

wpdb prepare – SQL インジェクション攻撃からクエリを守ろう

$wpdb->prepare

「$wpdb->prepare」とはプラグインなどを制作する際に「wpdb Class」を使ってデータベース接続する際、SQLインジェクション攻撃よりクリエを守る対策として用意されている関数です。

クエリを実行する前にデータをSQLエスケープするという動きをしております。

関数リファレンス/wpdb Class – SQL インジェクション攻撃からクエリを保護する

SQLインジェクション攻撃とは

SQLインジェクション攻撃とはSQL文の内容を書き換える攻撃です。SQL文を書き換え、保存するデータ内容を変更されたりします。

Wikipedia – SQLインジェクション

使い方

$wpdb->prepare( $query, $value_parameter[, $value_parameter ... ] )

$queryというのはSQL文で下記の様に 信頼できない値を%s (文字列)、 %d (整数)、%f (浮動小数点数) という値に書き換える必要があります。(後のパラメーター値は値を書き換えた分だけカンマ区切りで追加する必要があります。)

変更前

"INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( 10, $metakey, $metavalue )"

変更後

$wpdb->prepare("INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s ) ", 10, $metakey, $metavalue )

尚、 SQL文字定数の中で % を使う場合、LIKE のワイルドカードも含めて、 %% のように二重の % を書いてエスケープしなければなりません。

%%%s%%

はまる初心者の方いると思います。

使用する場所としては

$wpdb->get_var( $wpdb->prepare( " SELECT sum(meta_value) FROM $wpdb->postmeta  WHERE meta_key = %s ",  $meta_key ))

の様なWPクエリ実行関数の中で使用します。

信頼できない値に関してはこの$wpdb->prepareを使用してエスケープして下さい。