Запрос WP с LIKE в meta дает странный запрос


$results = new WP_Query( array(
    'post_type' => 'questions',
    'post_status' => 'publish',
    'no_found_rows' => '1',
    'nopaging' => '1',
    'ignore_sticky_posts' => '1',
    'orderby' => 'rand',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'reference-1',
            'value' => 'lucht',
            'compare' => '='
        ),
        array(
            'key' => 'reference-2',
            'value' => 'lucht',
            'compare' => '='
        )
    )
));
echo $results->request;

Дает: ВЫБЕРИТЕ wp_posts.* ИЗ wp_posts ВНУТРИ ПРИСОЕДИНИТЬСЯ К wp_postmeta НА (wp_posts.Идентификатор = wp_postmeta.post_id) ГДЕ 1=1 И ((wp_postmeta.meta_key = "ответ" И wp_postmeta.meta_value = "луч") ИЛИ (wp_postmeta.meta_key = "ответы" И wp_postmeta.meta_value = "луч")) И wp_posts.post_type = "вопросы" И ((wp_posts.post_status = "опубликовать")) ГРУППИРУЙТЕ ПО wp_posts.ПОРЯДОК ИДЕНТИФИКАТОРОВ ПО RAND()

Теперь замените мета_запрос compare = на НАПРИМЕР:

...
'meta_query' => array(
    'relation' => 'OR',
    array(
        'key' => 'reference-1',
        'value' => 'lucht',
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'reference-2',
        'value' => 'lucht',
        'compare' => 'LIKE'
    )
)
...

Дает: ВЫБЕРИТЕ wp_posts.* ИЗ wp_posts ВНУТРИ ПРИСОЕДИНИТЬСЯ К wp_postmeta НА (wp_posts.Идентификатор = wp_postmeta.post_id) ГДЕ 1=1 И ((wp_postmeta.meta_key = "ответ" И wp_postmeta.meta_value, НАПРИМЕР '{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d}lucht{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d} ') ИЛИ (wp_postmeta.meta_key = 'ответы' И wp_postmeta.meta_value, НАПРИМЕР '{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d}lucht{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d} ")) И wp_posts.post_type = "вопросы" И ((wp_posts.post_status = "опубликовать")) ГРУППИРУЙТЕ ПО wp_posts.ПОРЯДОК ИДЕНТИФИКАТОРОВ ПО RAND()

{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d} похоже, что это какое-то случайное значение размером 64 байта в фигурных скобках. Если бы вместо этого был %, запрос работал бы просто отлично.

Я проверил это на двух устанавливается на разные серверы (4.9.5), отключены все плагины.

Вопрос: Я делаю здесь что-то не так или мне следует создать уведомление об ошибке?

 2
Author: Herbert Van-Vliet, 2018-05-01

1 answers

Нет, вы все делаете правильно, и это действительно должно сработать, поскольку эти заполнители удаляются позже, прежде чем фактически выполнить запрос.

Это часть меры безопасности, введенной в WordPress 4.8.3. Цитата из соответствующего примечания разработчика:

В рамках выпуска WordPress 4.8.3 произошли изменения в esc_sql() поведение, которое может повлиять на разработчиков плагинов, которые ожидают esc_sql() для возврата строки, которую можно использовать за пределами контекст построения запроса для отправки в WPDB.

Источник: https://make.wordpress.org/core/2017/10/31/changed-behaviour-of-esc_sql-in-wordpress-4-8-3/

Если вам действительно интересно, что происходит, прочитайте сообщение в блоге Энтони Феррары, который обнаружил лежащую в основе vulnerability:https://blog.ircmaxell.com/2017/10/disclosure-wordpress-wpdb-sql-injection-technical.html

 2
Author: kraftner, 2018-05-01 10:10:34