Se connecter avec
S'enregistrer | Connectez-vous

Limiter l'utilisation d'un script

Dernière réponse : dans Programmation

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é.

Autres pages sur : limiter utilisation script

Lassé par la pub ? Créez un compte

Meilleure solution

Voilà un code testé et fonctionnel (à améliorer surement, html non conforme)

Code php de la page principale (j'ai utilisé un formulaire avec des boutons)
  1. <?php
  2.  
  3. if (isset($_POST['conex'])){ //conex = bouton de connexion
  4. session_start();
  5. $_SESSION['delai']= time();
  6. $_SESSION['name']= "Admin"; //exemple d'id
  7. $_SESSION['mdp']= "123";
  8. $_SESSION['acces']= 0; //pas d'accès au script
  9. }
  10.  
  11. if (isset($_POST['deco'])){
  12. session_destroy();
  13. $_SESSION= array();
  14. }
  15.  
  16. if (isset($_POST['go'])){
  17. header('Location: acces_limite.php'); //page limitée
  18. }
  19.  
  20. ?>


Code de la page limitée
  1. <?php
  2. session_start();
  3. if ((((time() - $_SESSION['delai']) <= 60) || (!isset($_SESSION))) && ($_SESSION['acces'] == 1)){ //délai en sec.
  4. header('Location: erreur.php');
  5. }
  6. else{
  7. $_SESSION['delai']= time();
  8. $_SESSION['acces']= 1;
  9.  
  10. ?>
  11. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<a href="http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd" target="_blank">http://www.w3.org/TR/1999/REC-html401-19991224/loose.dt...</a>">
  12. <html>
  13. <head>
  14. <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  15. <title>Test</title>
  16. </head>
  17. <body>
  18.  
  19. ACCES AU SCRIPT
  20.  
  21. </body>
  22. </html>
  23.  
  24. <?php
  25. } //fin else
  26. ?>


Page d'erreur
  1. <?php
  2. session_start();
  3. ?>
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<a href="http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd" target="_blank">http://www.w3.org/TR/1999/REC-html401-19991224/loose.dt...</a>">
  5. <html>
  6. <head>
  7. <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  8. <title>Test</title>
  9. </head>
  10. <body>
  11.  
  12. /!\ ACCES INTERDIT /!\
  13.  
  14. </body>
  15. </html>

Voilà un exemple, qui peut t'aider à te mettre sur la voie....
  1. <?php
  2. //init
  3. session_start();
  4. $_SESSION['delai']= time();
  5.  
  6. //dans le script restreint
  7. if ((time() - $_SESSION['delai']) <= 600){ //délai en sec.
  8. header('Location: erreur.php');
  9. }
  10. else{
  11. $_SESSION['delai']= time();
  12. }
  13. ?>

Ceci n'est qu'une base.

J'ai trouvé le script qu'il me faut, le voici:

  1. $host="localhost"; // Host name
  2. $username="xxxxxx"; // Mysql username
  3. $password="xxxxx"; // Mysql password
  4. $db_name="xxxxx"; // Database name
  5.  
  6. mysql_connect("$host", "$username", "$password" )or die("cannot connect to server" );
  7. mysql_select_db("$db_name" )or die("cannot select DB" );
  8.  
  9.  
  10. $time_flood = '30'; // 30 secondes
  11.  
  12. // COMMENT PROCEDER ??
  13.  
  14.  
  15. $time_flood = '30'; // 30 secondes
  16.  
  17. // 1° d'abord commencer par supprimer tout ceux dont le temps a expirer
  18. mysql_query("DELETE FROM flood WHERE dernier + $time_flood < " . time());
  19.  
  20. // 2° ensuite prenez l'ip du visiteur
  21. $resultat = mysql_query(
  22. "SELECT dernier FROM flood WHERE ip='$_SERVER[REMOTE_ADDR]'");
  23.  
  24. // 3° Si l'Ip du visiteur est deja dans la table, ai !!
  25. if(mysql_num_rows($resultat) > 0)
  26. echo 'Vous devez attendre !';
  27.  
  28.  
  29. // 4° sinon tout va bien, reste plus qu'a inserer l'ip de votre visiteur dans la
  30. // table
  31. else mysql_query("INSERT INTO flood VALUES ('$_SERVER[REMOTE_ADDR]', '" .
  32. time() . "')");
  33.  
  34. //DEBUT DE MON SCRIPT SI APRES VERIF --------------------------------------
  35.  
  36. function mdpAleatoire($longueur=5)
  37. {
  38. $mdp = '';
  39. // liste des caractères pour créer le mot de passe
  40. $caracteres = 'NBVCXWQSDFGHJKLMPOIUYTREZA1234567890';
  41. // longueur de la chaine
  42. $nombre_caractr
  43.  
  44. //etc..//


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.


edit: ce que tu me propose c'est pas par ip, donc ça peut pas aller.. Imagine le type il lance le script une fois: message: "impossible !" (car un autre type l'a utilisé 20 sec avant lui). Mais de toute façon j'ai le script ! Quelques modifs puis il sera fonctionnel :) 

Problème réglé:

  1. else
  2. {
  3. mysql_query("INSERT INTO flood VALUES ('$_SERVER[REMOTE_ADDR]', '" .time() . "')" );
  4. //ton script ici
  5. }


Et ça fonctionne


(faut pas croire que je fait expré de régler mes problèmes pour avoir des points, je pense plutôt à mon site :)  )

Ok, donc ta méthode fonctionnait.

Cependant je préfère la mienne car j'ai les adresse ip inclusent dans ma BDD. Comme ça je peux heu... Tracer les visiteurs ? Non, plus sérieusement, cela me permet aussi de connaitre la fréquence d'utilisation de mon script, ce qui est pas mal je trouve.

De plus c'est plus à la mode de supprimer ses cookies que de reboot son modem.

Edit: remarque.. Les proxy sont aussi à la mode. Mince,
Expert Programmation

Tu ne peux pas te choisir en tant que meilleure réponse. Si tu estimes qu'une de tes réponses mérite d'être sélectionnée, il te suffit de me le demander
;) 

Tiens, moi aussi, j'ai une demande : Utilise la balise [code], même pour quelques lignes.
[:zeb:6]

Ben en faite la "meilleur réponse" serait une réponse qui aurait un code valide de ce que je veux avec les cookies. Car si je fait:

  1. <?php
  2. //init
  3. session_start();
  4. $_SESSION['delai']= time();
  5. //dans le script restreint
  6. if ((time() - $_SESSION['delai']) <= 600){ //délai en sec.
  7. header('Location: erreur.php');
  8. }
  9. else{
  10. $_SESSION['delai']= time();
  11. }
  12. ?>


ça ne fonctionne pas, ça me met dans erreurs de cookies: "impossible à ajouter" ou un truc du genre.

De plus si je fait ça:

  1. <?php
  2. //init
  3. session_start();
  4. $_SESSION['delai']= time();
  5. //dans le script restreint
  6. if ((time() - $_SESSION['delai']) <= 600){ //délai en sec.
  7. header('Location: erreur.php');
  8. }
  9. else{
  10. $_SESSION['delai']= time();
  11. // MON CODE ICI
  12. }
  13. ?>


Et que je met mon code là où je l'ai indiqué, ça ne fonctionne pas.

(et biensûr, utopie: ce code en version "fonctionnel" combiné au code que j'ai fourni.. Mais ça je verais plus tard. Déja j'ai un code avec l'ip et BDD qui fonctionne) .

J'ai fais en plusieurs pages, c'est un exemple...comme je ne sais pas comment est organisé ton site.
Page_principale.php = Page d'accueil/de connexion
Page_limitee.php = Le fameux script dont la fréquence d'utilisation est limitée
Page_erreur.php (facultatif) = Message d'erreur

  1. <?php
  2. session_start();
  3. if ((((time() - $_SESSION['delai']) <= 60) || (!isset($_SESSION))) && ($_SESSION['acces'] == 1)){ //délai en sec.
  4. header('Location: erreur.php');
  5. }
  6. else{
  7. $_SESSION['delai']= time();
  8. $_SESSION['acces']= 1;
  9.  
  10. ?>
  11. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<a href="http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd" target="_blank">http://www.w3.org/TR/1999/REC-html401-19991224/loose.dt...</a>">
  12. <html>
  13. <head>
  14. <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  15. <title>Test</title>
  16. </head>
  17. <body>
  18. ACCES AU SCRIPT
  19. </body>
  20. </html>
  21. <?php
  22. } //fin else
  23. ?>


O-k, donc dans ce code, je met juste mon code dans les body puis ça fonctionne ?

J'ai de nouveau un problème avec ce script. J'aimerais faire en sorte que la limitation d'utilisation se fasse non pas pour le fichier: style: xx.php . Mais pour un attribut: style : xx.php?k=87 .

Seulement je vois pas comment je pourrais faire ... (et si c'est possible)

Problème réglé :

  1. if(isset($_SESSION['last_session_request'][$_GET['r']]) && $_SESSION['last_session_request'][$_GET['r']] > time() - 10){
  2. mail("xxxx@xxxxxx.xxx", "Flood! ".$_SERVER["REMOTE_ADDR"], "Origine: ".$_SERVER["HTTP_REFERER"]);
  3. header("location: ../echec.html");
  4. exit;
  5. }
  6. if (isset($_GET['r'])) $_SESSION['last_session_request'][$_GET['r']] = time(
Lassé par la pub ? Créez un compte