Множественные уязвимости Shop-Script

По привычке, время от времени, просматриваю сообщения об уязвимости скрипта Shop-Script. Компания Артикус, автор этого скрипта, уже давно перестала его поддерживать и продает теперь новую версию, более навороченную и красивую. Тем не менее этот скрипт разошелся по сети в миллионах копий, как легальных, так и нелегальных. А также породил великое множество продолжений и улучшений. Поэтому обнаруженный мною отчет, несмотря на то, что ему уже 2 месяца, будет интересен многим.

В отчете рассматривался Shop-Script Free — это как раз бесплатная версия того, что ходит по интернету огромным тиражом. На Free версии основана наиболее цельная и популярная доработка под названием «Shop-Script Free Lego Edition».

Вывод неутешительный. На 14 апреля в скрипте имелось 27 уязвимостей, позволяющих атакующему получить доступ к базе данных, манипулировать данными и скомпрометировать систему.

В частности ошибки, позволяющие выполнять команды SQL, в обработке параметров, передаваемых в скрипт: (1) add2cart, (2) c_id, (3) categoryID, (4) list_price, (5) name, (6) new_offer, (7) price, (8) product_code, (9) productID, (10) rating, and (11) save_product. Пруфлинк.

Показ товаров в категории Shop-Script

Во всех магазинах товар имеет свойство заканчиваться. Однако мы все надеемся на лучшее и временно отсутствующий товар с сайта не убираем.

В ShopScript есть 2 пути не дать заказать пользователю отсутствующий товар — включить в разделе «Настройки ->Корзина и оформление заказов» опцию «Вести учет товаров на складе» и тогда в свойствах товара надо будет вести количество по каждой позиции. Второй путь проще: установить товару нулевую цену, тогда ShopScript не будет показывать для этого товара ссылку на добавление в корзину.

Лично я предпочитаю второй путь, он для меня немного проще.

Однако, при показе товаров в категории ShopScript сортирует их по полям sort_order (порядок сортировки) и name (название). Из-за этого отсутствующие товары идут вперемешку с наличиствующими. Хотелось бы наоборот, чтобы те товары, которых в данный момент нет в наличии отображались бы в конце списка и на это не влиял выбор порядка сортировки (по имени, по цене и т.п.). То есть, чтобы все типы сортировок, которые науказывал посетитель применялись к тем товарам, которые можно заказать, а отсутствующие были все равно в конце списка. Читать далее Показ товаров в категории Shop-Script

Формат строки с ценой

В Shop-script Pro и Premium весьма интересная реализована функция форматирования числа в денежный формат. Чтоб точка была разделителем, разряды отделялись запятой и т.д. Приводить весь «оригинальный» код смысла нет, кто интересуется — может это сделать самостоятельно.

Весь этот чудесный функционал находится в файле /core_functions/functions.php. Интересующая нас функция называется _formatPrice(). Все содержимое этой функции надо закомментировать и написать только одну строчку:

Закомментированные 32 строки, в том числе 3 цикла делали то же самое. :-)

Кэшируй, кэшируй, кэшируй запрос назло буржуазной Европе!

Предыстория этого вопроса такова: одно время магаз на ShopScript работал у меня на довольно хилом VDS и посещения поисковых ботов практически клали сервер на обе лопатки. Типичная, так сказать, DDOS атака :-) Поэтому я озаботился производительностью самого скрипта. Предпринял следующие логичные, как мне кажется, шаги:

  1. Добавил недостающие индексы в разные таблицы с товаром, параметрами товара, категории, валюты и т.д.
  2. Убрал подсчет запросов категорий и товаров. Во-первых это оказалась бесполезная фича, во-вторых это было просто.
  3. Закэшировал несколько запросов.

Эти три пункта помогли решить проблему. Не знаю, какой оказал бОльшее влияние, но первого точно было недостаточно. Читать далее Кэшируй, кэшируй, кэшируй запрос назло буржуазной Европе!

Отключаем у Shop-Script показ погоды на Луне

— Как же так, Родион, старушку – всего за 20 копеек!!!
— Ну не скажите, Порфирий Петрович… Пять старушек – уже рупь…

Сначала обоснование. Счетчик показов информации о товаре и показов категории – обычное целочисленное поле в БД. Каждый раз когда запрашивается категория или просмотр информации о товаре, Shop-Script прибавляет к значению единицу. В теории должна получиться статистика просмотров и распределение товаров по популярности. Но кроме людей сайт посещает еще много разной живности, да и, скажем троекратный, просмотр товара одним пользователем не может считаться тремя просмотрами. В итоге такие сомневающиеся пользователи вместе с шумной и прожорливой толпой поисковых ботов накручивают эти счетчики. Как следствие — наиболее точно эти самые счетчики показывают погоду на Луне. Читать далее Отключаем у Shop-Script показ погоды на Луне

Улучшаем URL в Shop-Script

Идея в общем-то простая – с помощью апачевского модуля mod_rewrite преобразовать “красивые” URL в такой набор параметров, которые понимает скрипт.

Самые частые пути:

Создадим в корне сайта файл .htaccess, если, конечно, его еще нет. И добавим в него такие строчки:

Скажу честно – я не профессионал в составлении правил для mod_rewrite и Perl-овые регулярки знаю поверхностно. Наверняка эти команды можно оптимизировать, но надо же с чего-то начинать.

Собственно добавлением этих строчек все и заканчивается. Теперь вместе с теми URL, которые я написал выше будут работать и такие:

А дальше надо править шаблоны. И, кое-где, файлы скрипта. Искать строчки типа

и заменять на

Переменная у Smarty может называться и по-другому – зависит от шаблона. В общем смотреть, где формируются ссылки на категории и продукты. А также менять относительные ссылки на картинки и т.п. на абсолютные. В смысле

на

Какие еще URL перезаписать? :-)