Bannir une liste d'IP

enky
Invité n'ayant pas de compte PHPfrance

17 sept. 2005, 20:17

Salut,
Je souhaite bannir une liste d'IP que j'ai ajouté dans un fichier texte : listeban.txt

Ce fichier texte contient tous les IP à bannir (avec un espace entre chaque IP). Exemple : 999.99.999.999 888.88.888.888 777.77.777.777

Pour bannir un IP, il suffit de faire :
if($REMOTE_ADDR == 'XXX.XXX.XXX.XXX')
{ echo 'Vous êtes banni !';
exit();}
Mais comment faire si j'ai une liste d'IP que j'ai ajouté dans le fichier texte listeban.txt ?

Eléphant du PHP | 417 Messages

17 sept. 2005, 20:35

---
Modifié en dernier par JazzFinder le 28 juin 2006, 19:34, modifié 1 fois.

enky
Invité n'ayant pas de compte PHPfrance

17 sept. 2005, 20:54

Sans BDD c'est plus simple. Il suffit de copier-coller dans n'importe quel script.

Eléphant du PHP | 417 Messages

17 sept. 2005, 21:59

---
Modifié en dernier par JazzFinder le 28 juin 2006, 19:34, modifié 1 fois.

Mammouth du PHP | 1885 Messages

17 sept. 2005, 23:37

Bonjour,

Quel est le problème exact?
- La vérification auprès de plusieurs adresses IP?
- La possibilité de vérifier une étendue d'IP?
- Le stockage des adresses IP bannies?

Il faut nous expliquer plus en détails le problème si tu désires de l'aide.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

enky
Invité n'ayant pas de compte PHPfrance

18 sept. 2005, 12:24

Je souhaite vérifier que l'IP du visiteur n'est pas dans la liste des IP bannis (le fichier listeban.txt où il y a déjà une longue liste).

Si oui, alors faire exit();

Petit nouveau ! | 3 Messages

18 sept. 2005, 12:57

Le mieux se serait de le faire avec une BDD alors tu fais a la main un truc du style
If ($ip<xxx.xxx.xxx) (ou) ($ip=xxx.xxx.xxx)
{
echo "vous ètes banni !"
}
$ip contiendrais l'ip (evidemment)

enky
Invité n'ayant pas de compte PHPfrance

18 sept. 2005, 17:22

Oui, mais la liste des IP indésirables se trouve dans un fichier texte : listeban.txt

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 sept. 2005, 17:31

Salut, en començant à récuperer les ip du fichier text:
:arrow: fopen()
:arrow: fgets()

HD
Mammouth du PHP | 1181 Messages

18 sept. 2005, 17:59

probleme : si je me connecte avec une ip deja utilisée par quelqu'un banni, je serais traité injustement (oui je sais la probabilité est tres faible mais bon... c'est possible !)
mais surtout : l'ip change à chaque connexion donc dans quelque temps tu te retrouvera avec une TRES longue liste tres lourde (et lente) à gerer -à chaque fois que quelqu'un se connecte- et surtout qui ne servira à RIEN puisque l'ip du banni changera à chaque fois !!!
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

Petit nouveau ! | 4 Messages

18 sept. 2005, 20:30

Je te propose ici une solution :

Pour commencer je pense que tu devrai disposer d'une adresse IP par ligne dans ton fichier Listeban.txt :

Code : Tout sélectionner

XXX.XXX.XXX.XXX YYY.YYY.YYY.YYY ZZZ.ZZZ.ZZZ.ZZZ
ensuite pour verifier si l'adresse qui tente de se connecter est banni tu peux procéder ainsi :
// on ouvre le fichier Listeban.txt qui se trouve ici à la racine
// ouverture en mode lecture ("r")
$fichier = fopen("./Listeban.txt" , "r");

if ($fichier){ // Le fichier Listeban.txt a bien été ouvert
	// on test chaque ligne (donc adresse ip) pour la comparer
	while (!feof ($fichier)) {
		// on récupere la ligne
	  $adr_ip = fgets($fichier, 4096);
	  // on enleve les eventuel espace en début et fin de la ligne
	  $adr_ip = trim($adr_ip);
	  if ( $adr_ip == $REMOTE_ADDR){
	  	//code a executer en cas d'ip banni trouvée
	  	echo 'Vous êtes banni !';
	  	// on referme le fichier Listeban.txt
	  	fclose ($fichier);
		// on quitte le script
		exit();
	  }
	}
	// on referme le fichier Listeban.txt
	fclose ($fichier);
}
else { // Le fichier Listeban.txt est introuvable
	echo 'fichier introuvable';
}
Voila.

enky
Invité n'ayant pas de compte PHPfrance

18 sept. 2005, 21:46

Merci beaucoup ! C'est exactement ce que je veux !

Par contre, les lignes :
else { // Le fichier Listeban.txt est introuvable
echo 'fichier introuvable';

ne servent à rien, parce que si le fichier listeban.txt est introuvable, alors ca renvoi une erreur à la ligne 3.

Mammouth du PHP | 19672 Messages

18 sept. 2005, 21:49

Alors un petit test de vérification:
// On vérifie l'existence du fichier
if(file_exists("./Listeban.txt"))
{
    // on ouvre le fichier Listeban.txt qui se trouve ici à la racine
    // ouverture en mode lecture ("r")
    $fichier = fopen("./Listeban.txt" , "r");

    if ($fichier)
    {
        // Le fichier Listeban.txt a bien été ouvert
        // on test chaque ligne (donc adresse ip) pour la comparer
        while (!feof ($fichier))
        {
            // on récupere la ligne
            $adr_ip = fgets($fichier, 4096);
            // on enleve les eventuel espace en début et fin de la ligne
            $adr_ip = trim($adr_ip);
            if ( $adr_ip == $REMOTE_ADDR){
                //code a executer en cas d'ip banni trouvée
                echo 'Vous êtes banni !';
                // on referme le fichier Listeban.txt
                fclose ($fichier);
                // on quitte le script
                exit();
            }
        }
        // on referme le fichier Listeban.txt
        fclose ($fichier);
    }
    else
    {
        // Le fichier Listeban.txt est introuvable
        echo 'fichier introuvable';
    }
}
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1885 Messages

18 sept. 2005, 23:31

Bonjour,

Pourquoi ne pas utiliser la fonction file() afin de charger complètement le fichier dans un tableau pour ensuite utiliser la fonction in_array() ?

Cette fonction ferait exactement le même traitement que vous faites présentement mais en moins de ligne. La fonction in_array() devrait arrêter sa recherche dès qu'il trouvera une occurence de la valeur recherchée.

Pour ceux qui sont toujours sceptique fasse à la performance de cette méthode, une comparaison serait la bienvenue et je me soumettrai volontier aux résultats retournés.

Vous pouvez également utiliser la fonction ip2long() et long2ip() pour tranformer une adresse IP en format numérique. Ceci permet d'avoir une adresse IP plus facile à manipuler puisqu'elle ne comporte plus de points et que des intervalles peuvent être facilement calculés.

La solution de la base de données est également envisageable. Cependant est-ce qu'une connexion vers une base de données SQL vaudrait réellement la peine pour le traitement voulu? S'il y a une connexion déjà établie, alors ce serait une solution envisageable. Dans le cas contraire, il ne serait pas approprié d'en créer une si l'on peut obtenir le même résultat par lecture d'un simple fichier texte.

La base de données pourrait permettre en revange un calcul et une récupération des IP plus facile. Vous pourrez également créer des intervales plus facilement en créant deux champs représentant le début de l'intervale et sa fin.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP