IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Limiter le temps d'exécution d'une requête MySQL


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut Limiter le temps d'exécution d'une requête MySQL
    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.

  2. #2
    Membre averti
    Avatar de Dumbeldor
    Homme Profil pro
    Développeur Concepteur Banque postale / Ecole d'ingénieur Alternance
    Inscrit en
    Novembre 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Concepteur Banque postale / Ecole d'ingénieur Alternance

    Informations forums :
    Inscription : Novembre 2013
    Messages : 88
    Points : 301
    Points
    301
    Par défaut
    Serait-il pas plus judicieux de stocker dans une session le nombre de requête fait par un utilisateurs et de le limiter ?
    Car là tu risque de pénaliser aussi tes visiteurs.
    N'oubliez pas de mettre un petit pouce vert si mon message vous a aidé !

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur PHP
    Inscrit en
    Mai 2014
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur PHP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 37
    Points : 76
    Points
    76
    Par défaut Des pistes
    - pour prévenir les attaques genre D.O.S. tu peux mettre en place fail2ban avec la bonne config.
    - Pour avoir un meilleur temps de réponse sur ta requête surtout si elle est répétitive par la forme et données retournées activer le query cache de mysql
    - Pour optimiser la requête en elle même vérifier que les index existent sur les colonnes jointes.

    Ce ne sont que quelque pistes.

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2007, 12h10
  2. [MySQL] temps d'ouverture d'une connexion VS temps d'exécution d'une requête
    Par epoz dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/04/2007, 18h06
  3. Calculer le temps d'exécution d'une requête
    Par BRAUKRIS dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/03/2007, 12h59
  4. [MySQL] Temps d'exécution d'une requête
    Par eon-of-the-scorn dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/07/2006, 11h06
  5. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo