Поддержка Проблемы и решения теги nextgen gallery vs $wpdb->prepare

  • Решено iij

    (@iij)


    Я, по-моему, или отловил баг, или криворукий совсем (это более вероятней, ибо столкнуться должны много кто с ним).

    возможно, это связано с этим.

    Суть: если изображению выставляется метка на русском языке, то последующий вывод галереи изображений по заданному тегу не производится (тег nggtags или функция nggShowGalleryTags). При этом с альбомом (nggShowAlbumTags) такой проблемы нету. В общем, это выглядело очень подозрительно, и я полез по дереву вызовов искать место ошибки. И нашел, кажется, что-то интересное.

    Итак, функция nggShowGalleryTags получает название тега, например, ‘слоупок’. Она вызывает nggTags::find_images_for_tags. Там после обработки функцией sanitize_title тег получает «безопасный» вид ‘%d1%81%d0%bb%d0%be%d1%83%d0%bf%d0%be%d0%ba’, в базе slug в этом виде и хранится.

    Тут-то и начинаются радости. Собранный sql-запрос с этим тегом отправляется «на дезинфекцию» к функции $wpdb->prepare (wp-db.php). В ней производятся некие шаманства (честно — не особо вдумывался что к чему), производится обработка спецификатора строки %s, после чего производится подстановка в запрос аргументов при помощи vsprintf. На этом нормальная работа прекращается, и это не удивительно: если распечатать запрос, который является строкой форматирования для vsprintf, то мы увидим следующее:

    SELECT term_id FROM vcf_terms WHERE slug IN ('%d1%81%d0%bb%d0%be%d1%83%d0%bf%d0%be%d0%ba') ORDER BY term_id ASC

    и если приглядеться, эта строка форматирования полна спецификаторов целого числа %d. vsprintf, я так понял, от этого просто сходит с ума. Да, в общем, и умничать не надо — в описании функции четко написано, что «настоящий» символ процента должен быть экранирован вторым процентом. Этого сделано не было, отсюда и беды.

    Если же в функции find_images_for_tags убрать проверку, то есть передавать $wpdb->get_col запрос без предварительной проверки prepare`ом, то все работает без проблем (пусть и ценой безопасности). Ну или достаточно поменять у nextgen-метки slug на вариант без кирилицы, хотя это уход от проблемы, а не решение.

    Спасибо за внимание, надеюсь на экспертную оценку.

Просмотр 1 ответа (всего 1)
  • Atrax

    (@atrax)

    Ethical engineer

    Ну что тут скажешь?
    Видимо, cyr2lat в таких случаях — обязателен.

Просмотр 1 ответа (всего 1)
  • Тема «теги nextgen gallery vs $wpdb->prepare» закрыта для новых ответов.