Limiter l'utilisation d'un script - Apprendre-PHP.com

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Limiter l'utilisation d'un script

Par arbilus -  5 reponses -  Le 22/06/2010 -  Flux RSS - 
Bonjours ! Alors voila, j'ai un problème car j'aimerais faire en sorte de limiter la fréquence d'utilisation d'un script PHP grace à l'ip de l'utilisateur. 
Style: la personne a utilisé le script, elle ne peut l'utiliser de nouveau que 10 min plutard, et si elle l'utilise avant et bien elle est redirigée. 
Je me doute qu'il faut utiliser la BDD, mais je vois pas du tout comment je peux faire au nouveau du script et de la BDD. 
Je pense que ça serait un truc du style:  
-> le type réutilise/utilise le script -> select dans la BDD où user_ip = $ip -> si l'interval est de moins de 10min alors redirection  et si pas user_ip = $ip OU intervale superieur à 10min alors inscription dans de son $ip + de heu.. "l'indicateur de temps" dans la BDD puis utilisation du script autorisé. 
 

Réponses apportées à cette discussion

Par Cyrano -  Le 22/06/2010 - 

Analyse ton problème avec logique : quels sont les éléments dont tu disposes ?

  1. L'utilisateur doit-il s'identifier pour accéder à la page utilisant ce script ?
  2. Tu as son adresse IP mais attention, si certains utilisateurs passent par un proxy ou encore sont derrière un routeur de réseau sur lequel plusieurs utilisateurs existent, ils auront tous la même adresse IP;
  3. Tu as l'instant auquel l'utilisateur accède à la page en question.
  4. Tu as défini une durée pendant laquelle on ne peut pas ré-utiliser la page

 Partant de ces informations, continue le raisonnement ... :)

 

 

 
Par arbilus -  Le 22/06/2010 - 
J'ai trouvé le script qu'il me faut, le voici: 
  1. J'ai trouvé le script qu'il me faut, le voici:
  2.  
  3. [code=php]$host="localhost"; // Host name
  4. $username="xxxxxx"; // MySQL username
  5. $password="xxxxx"; // MySQL password
  6. $db_name="xxxxx"; // Database name
  7.  
  8. mysql_connect("$host", "$username", "$password" )or die("cannot connect to server" );
  9. mysql_select_db("$db_name" )or die("cannot select DB" );
  10.  
  11.  
  12. $time_flood = '30'; // 30 secondes
  13.  
  14. // COMMENT PROCEDER ??
  15.  
  16.  
  17. $time_flood = '30'; // 30 secondes
  18.  
  19. // 1° d'abord commencer par supprimer tout ceux dont le temps a expirer
  20. mysql_query("DELETE FROM flood WHERE dernier + $time_flood < " . time());
  21.  
  22. // 2° ensuite prenez l'ip du visiteur
  23. $resultat = mysql_query(
  24. "SELECT dernier FROM flood WHERE ip='$_SERVER[REMOTE_ADDR]'");
  25.  
  26. // 3° Si l'Ip du visiteur est deja dans la table, ai !!
  27. if(mysql_num_rows($resultat) > 0)
  28. echo 'Vous devez attendre !';
  29.  
  30.  
  31. // 4° sinon tout va bien, reste plus qu'a inserer l'ip de votre visiteur dans la
  32. // table
  33. else mysql_query("INSERT INTO flood VALUES ('$_SERVER[REMOTE_ADDR]', '" .
  34. time() . "')");
  35.  
  36. //DEBUT DE MON SCRIPT SI APRES VERIF --------------------------------------
  37.  
  38. function mdpAleatoire($longueur=5)
  39. {
  40. $mdp = '';
  41. $caracteres = 'NBVCXWQSDFGHJKLMPOIUYTREZA1234567890';
  42. $nombre_caractr
  43.  
  44. //etc..//[/code]
  45.  
  46. Seulement il y a un problème: quand le type lance le script 2 fois en moins de 30 secondes le message "Vous devez attendre!" s'affiche bien, mais le script en dessous (mon script) s'execute quand même. Je ne sais pas comment je pourrais faire pour "l'inclure" dans les "conséquence" de if.

 

Seulement il y a un problème: quand le type lance le script 2 fois en moins de 30 secondes le message "Vous devez attendre!" s'affiche bien, mais le script en dessous (mon script) s'execute quand même. Je ne sais pas comment je pourrais faire pour "l'inclure" dans les "conséquence" de if.
 
Par arbilus -  Le 22/06/2010 - 

  1. else
  2. {
  3. mysql_query("INSERT INTO flood VALUES ('$_SERVER[REMOTE_ADDR]', '" .time() . "')" );
  4. //ton script ici
  5. }
 
-> problème réglé 

 

 
Par Cyrano -  Le 22/06/2010 - 

Heureusement que je mentionne de temps à autres « rigueur et déscipline » : ça ou souffler dans un violon, ça ne fait pas une musique meilleure...

Prends l'habitude dès maintenant de coder proprement. Ok, au début, ça prend un peu de temps, ça peut être rébarbatif, mais tu éviteras souvent des erreurs stupides par inattention. Ne mets pas des guillemets quand c'est complètement inutile, et par contre, fais des concaténations propres. Deux exemples :

-1- ce que tu fais :

  1. mysql_connect("$host", "$username", "$password") or die("cannot connect to server");

À quoi servent les guillemets ici ??

-1- Ce qu'il faut faire :

  1. $cnx = mysql_connect($host, $username, $password) or die("cannot connect to server");

Et me diras-tu, pourquoi une variable pour stocker la connexion ? Pour te permettre si besoin est d'en avoir une autre en parallèle qui soit indépendante pour d'autres opérations.

-2- Ce que tu fais : 

  1. $resultat = mysql_query("SELECT dernier FROM flood WHERE ip='$_SERVER[REMOTE_ADDR]'");

Je te signale qu'ici, $_SERVE[REMOTE_ADDR] est mal écrit et devrait s'écrire $_SERVER['REMOTE_ADDR'] : mais voilà, tu as un problème de conflit avec les apostrophes. C'est une variable PHP, pas du SQL, donc, fais une concaténation propre comme ceci.

-2- Ce qu'il faut faire :

  1. $resultat = mysql_query("SELECT dernier FROM flood WHERE ip='". $_SERVER['REMOTE_ADDR'] ."'");

;)

 

 

 

 
Par arbilus -  Le 22/06/2010 - 

Oui, c'est vrai, mais ça fonctionnait quand même :D . Mais t'as raison, car si on s'habitue aux fautes après le jour où on en fait beaucoup on les repere plus.

 

Ajouter une réponse à la discussion

Seuls les membres loggués sont autorisés à poster dans les forums !