web-dev-qa-db-ja.com

Wpdb-> prepare byカラム名を使う

私の現在のプラグインでは、私はユーザー入力として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()を使うための正しい方法でもありますか?自分で手動でエスケープする必要がありますか?

4
Sudar

列名に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を使用していないのはなぜだろうか。

5
s_ha_dum

ホワイトリストは 'ASC'、DESC 'には良い選択肢ですが、あなたのORDERBY句のテーブル名にはWordPressがあなたにぴったりの組み込み関数を持っています!

https://codex.wordpress.org/Function_Reference/sanitize_sql_orderby

$order_by_col = sanitize_sql_orderby( $order_by_col );

1
Tom Auger