私の現在のプラグインでは、私はユーザー入力としてorder by
列を取り上げています。それで私はそれをエスケープするためにwpdb->prepare
を使うことを考えました。
$wpdb->get_results($wpdb->prepare("Select id from $wpdb->posts order by %s %s", $order_by_col, $order_by);
それはに変わってしまうのでこれは動作していません
select id from wp_posts order by 'post_date' 'asc'
(引用符に注意してください)
それで、引用符を削除する方法はありますか?これは$ wpdb-> prepare()を使うための正しい方法でもありますか?自分で手動でエスケープする必要がありますか?
列名にprepare
を使用することはできません。また、ソート順にも実際には使用できません。 prepare
は常に文字列をクォートします。自分で値を交換する必要があります。データを「サニタイズ」するのではなく、ホワイトリストアプローチを使用します。
$orderby = array(
'date' => 'post_date',
// etc
);
$sortorder = array(
'asc' => 'ASC',
'desc' => 'DESC',
);
$orderbycol = 'ID'; // just a default
if (isset($_GET['orderby'])
&& isset($allowed[$_GET['orderby']])) {
$orderbycol = $allowed[$_GET['orderby']];
}
$order = 'ASC';
if (isset($_GET['order'])
&& isset($sortorder[$_GET['order']])) {
$order = $sortorder[$_GET['order']];
}
$sql = "Select id from $wpdb->posts order by $orderbycol $order";
echo $sql;
しかし、私はあなたがこれにWP_Query
を使用していないのはなぜだろうか。
ホワイトリストは 'ASC'、DESC 'には良い選択肢ですが、あなたのORDERBY句のテーブル名にはWordPressがあなたにぴったりの組み込み関数を持っています!
https://codex.wordpress.org/Function_Reference/sanitize_sql_orderby
$order_by_col = sanitize_sql_orderby( $order_by_col );