Защитить сайты от "атаки"

ЗахидХост обнаружили “атаку” на сайт очень простым методом.
Кто-то крепко вешал сайт загружая по 500 товаров на страницу вручную добавив параметр к УРЛ более 13000 запросов за 12 часов.
Все было с разных IP, поэтому сервер не отсек это.
%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5
LoadAveraпe на 6тиядерном зашкаливал до 50+

Необходимо
1 Запретить загрузку количества товаров превышающих стандартные (те что высчитываются в функции fn_get_product_pagination_steps) . В идеале, чтобы при попытке ввода любого отличного значения выводился урл без параметра и загружалось количество товаров указанных в настройках магазина.

2 Сделать возможность в админке задавать количество товаров для вывода. Без ковыряния в коде.
%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5
Или хотя бы сделать зависимость логичной.
Сейчас тут /app/functions/fn.products.php имхо нелогичная функция, которая зависит от кол-ва столбцов.
%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5
И получается 16 (что даже меньше кол-ва в настройках), 20, 32, 48

Хотя по идее должна зависить от количества товаров указанных в настройке

%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5
чтобы было 20, 40, 80

спасибо @albinoz и @furniel за решения




Просьба внедрить это в Коробку Карта как можно скорее, учитывая несложность доработки.




  • Поддерживаю запрос 1
  • Поддерживаю запрос 2
  • Ничего не надо менять, я так вешаю сайты конкурентов)
  • Меня и так все устраивает

0 голосов

4 лайка

Так же хочу обратить внимание - не фильтруются спецсимволы в поле email, до сих пор. Любой клиент скопировавший email с почтовика немного невнимательно может сломать обмен с 1С. Вот, проверил, на демке. Заказ оформился без проблем с квадратной скобкой в поле email.



Причем в 1С не уйдет не только этот заказ, а вообще никакие следующие за ним.

5 лайков

может лучше в отдельную тему? а то начнется тут свалка и ничего не получим…

2 лайка

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

1 лайк

Привет всем. У меня недавно была атака. Несколько миллионов запросов по
?items_per_page=96000.

Кто-то смог предотвратить данную проблему?

Спасибо

У нас пару месяцев назад была такая же фигня. Серверный админ сказал что атака идет с github, у нас висело по 100.000 и сайт просто вырубало, писало nginx, серверный админ забанил бота или атаку, и все было хорошо.

Что напрягло, он сказал что это наш местный ip был, полагали на конкурентов.

В общем мы банили просто тех откуда шли огромные запросы. Сейчас вроде все хорошо, благодаря @alex_vp он дал много рекомендаций, и они нам очень помогли.

1 лайк

Где то на форуме было решение. Если items_per_page превышает вбитое вами число, то все равно ставится наапример 20 сервером.

К сожалению перелопатил весь форум. Не смог найти.

поставьте

'items_per_page' => $params['items_per_page'] > 20 ? 20 : $params['items_per_page'],

Хотя это не совсем корректно будет работать - будут пропуски при листании.
возможно надо попробовать вот так заменить в начале функции

$params['items_per_page']  = $params['items_per_page'] > 20 ? 20 : $params['items_per_page'];

также это можно сделать через хук generate_pagination_pre

2 лайка

Нашел у себя.
В файле, хз почему именно там
/www/app/addons/my_changes/controllers/frontend/product_features.pre.php
И вот последняя кода часть как раз эта защита, если кто то руками ввведет больше 80, то его отправит на 20 товаров на страницу (у меня по умолчанию столько)

<?php
if ($mode == 'view_all') {
    if (empty($_REQUEST['filter_id'])) $_REQUEST['filter_id'] = 10; // 10 - это id фильтра по бренду
}

if (!defined('BOOTSTRAP')) { die('Access denied'); }

if ($mode == 'view') {
	if (!empty($_REQUEST['items_per_page']) && $_REQUEST['items_per_page'] > 80){
		$_REQUEST['items_per_page'] = 20;
	}
}

ааа вот оно все решение

2 лайка