Bonjour,
J'ai un gros problème en ce moment, un pirate s'amuse à me saturer ma base de données avec des requêtes longues. Pour cela il a trouvé une faille dans un module de mon Prestashop (pour info la navigation à facette) et il fait des appels à des pages sur des requêtes lourdes ce qui fait planter le serveur au bout d'un moment car les requêtes s'acculent.
Pour information la requête est de ce type :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SELECT m.name, COUNT(DISTINCT p.id_product) nbr, m.id_manufacturer , m.name, psi.price_min, psi.price_max FROM `sb_category_product` cp INNER JOIN `sb_category` c ON (c.id_category = cp.id_category) INNER JOIN sb_product p ON (p.id_product = cp.id_product) INNER JOIN sb_manufacturer m ON (m.id_manufacturer = p.id_manufacturer OR m.id_manufacturer = p.id_manufacturer2) INNER JOIN sb_product_shop product_shop ON (product_shop.id_product = p.id_product AND product_shop.id_shop = 3) INNER JOIN `sb_layered_price_index` psi ON (psi.id_product = p.id_product AND psi.id_currency = 1 AND psi.id_shop=3) WHERE c.nleft >= 3757 AND c.nright <= 3758 AND c.active = 1 AND product_shop.active = 1 AND product_shop.`visibility` IN ("both", "catalog") GROUP BY p.id_manufacturer ORDER BY m.name;
Et dans le slow mysql log je vois qu'elle dure 40 secondes en général quand le serveur est saturé (sinon c'est quasi rien). J'aimerais tout d'abord limiter le temps d'exécution d'une requête SQL mais je ne vois rien pour cela dans my.conf. Ca serais bien aussi de mettre un parefeu (je suis sous débian) afin de dire que si cette IP se connecte pour la 300ième fois, sans forcément la bloquer on lui répond plus lentement.
Partager