begin process at 2010 03 22 16:53:10
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > BANNISSEMENT PAR IP (PDO REQUIS)

BANNISSEMENT PAR IP (PDO REQUIS)


 Information sur la source

Note :
Aucune note
Catégorie :Astuces Classé sous :ip, bannissement, pdo Niveau :Débutant Date de création :01/08/2007 Vu :6 789

Auteur : Luzy

Ecrire un message privé
Commentaire sur cette source (27)
Ajouter un commentaire et/ou une note

 Description

Voici un simple code qui vous permet de bannir ou débannir une IP. PDO est requis pour la gestion de la BDD mais étant donnée la simplicité du code et de la table demandée, il vous sera facile d'adpter le code pour utiliser un fichier texte.

(Pour la table, il s'agit d'une simple table avec un seul champ en vachar(16) nommé "ip", la table est nommé "ip_ban")

Si l'utilisation de la variable $_SERVER['REMOTE_ADDR'] vous rebute, il est également aisé d'adapter avec la source qui se trouve içi: http://www.phpcs.com/codes/RECUPERER-IP-VISITEUR_4 0034.aspx

A noter qu'il existe deux usages possible:
[1] Avec une vérification dans l'index de votre site et une redirection comme c'est le cas içi (ce qui interdit jusqu'à la visite du site par l'ip bannis)
[2] Avec une verification par exemple avant l'affichage d'un formulaire pour poster un commentaire, sans direction (plus souple, celà permet de garder un visiteur qui se voit restreint les fonctions interactives de votre site)

Source

  • --------------------------VERIFICATION---------------------------------------
  • <?
  • // Script de bannissement d'IP
  • // Version 1.0
  • // Auteur: Angellore
  • // Permet un banissement d'IP au niveau d'une fonction ou d'un accès global à un site.
  • // Connexion SQL (A supprimer lors d'une utilisation réelle puisqu'on suppose qu'elle est déjà faite)
  • $user = 'root';
  • $pass = '';
  • $ban_mess = 'Vous avez été bannis de ce site! Vilain pas beau!<br />'; // Message affiché si la redirection de marche pas.
  • $dbh = new PDO('mysql:host=localhost;dbname=localhost', $user, $pass);
  • foreach ($dbh->query('SELECT * from ip_ban WHERE ip = "'.$_SERVER['REMOTE_ADDR'].'"') as $row)
  • {
  • if(!empty($row))
  • {
  • header("Location: http://google.fr"); // Redirection
  • exit();
  • echo $ban_mess;
  • }
  • }
  • ?>
  • --------------------------FORMULAIRE ADMIN------------------------------------
  • <?
  • // Connexion SQL (A supprimer lors d'une utilisation réelle puisqu'on suppose qu'elle est déjà faite)
  • $user = 'root';
  • $pass = '';
  • $dbh = new PDO('mysql:host=localhost;dbname=localhost', $user, $pass);
  • switch ($_GET['a'])
  • {
  • case 'ban': // Bannissement
  • // Verifications de la validité du formulaire
  • if ($_POST['verif'] != '1') { echo '<span class="warn">Veuillez cocher la case de vérification de soumission du formulaire</span>'; }
  • else
  • {
  • $dbh->exec('INSERT INTO ip_ban (ip) VALUES ("'.$_POST['ip'].'")');
  • echo 'L\'adresse IP ('.$_POST['ip'].') a correctement été bannie.';
  • }
  • break;
  • case 'dban': // Debannissement
  • $dbh->exec('DELETE FROM ip_ban WHERE ip = "'.$_POST['ip'].'"');
  • echo 'L\'adresse IP ('.$_POST['ip'].') a correctement été débannie.';
  • break;
  • }
  • ?>
  • <!-- Exemple de Style -->
  • <style>
  • .warn { color: FF0000; }
  • </style>
  • <h5> Bannir une adresse IP </h5>
  • <form method=post action="?a=ban">
  • <input type="text" name="ip" value="<? echo $_POST['ip']; ?>" size="11" maxlength="15" /><br />
  • <label><input type="checkbox" name="verif" value="1" /><b>Êtes-vous sur(e)?</b> <span class="warn">/!\ Il s'agit d'une action lourde de conséquences.</span></label><br />
  • <input type="submit" name="go" value="GO" />
  • </form>
  • <h5> Débannir une adresse IP </h5>
  • <form method=post action="?a=dban">
  • <select name="ip" size="1">
  • <?
  • foreach ($dbh->query('SELECT * from ip_ban') as $row) // On va chercher les adresses déjà enregistrées pour les proposer comme choix
  • {
  • echo '<option value="'.$row['0'].'">'.$row['0'].'</option>';
  • }
  • ?>
  • </select>
  • <input type="submit" name="go" value="GO" />
  • </form>
--------------------------VERIFICATION---------------------------------------
<?

// Script de bannissement d'IP
// Version 1.0
// Auteur: Angellore
// Permet un banissement d'IP au niveau d'une fonction ou d'un accès global à un site.

// Connexion SQL (A supprimer lors d'une utilisation réelle puisqu'on suppose qu'elle est déjà faite)

$user = 'root';
$pass = '';
$ban_mess = 'Vous avez été bannis de ce site! Vilain pas beau!<br />'; // Message affiché si la redirection de marche pas.

$dbh = new PDO('mysql:host=localhost;dbname=localhost', $user, $pass);

foreach ($dbh->query('SELECT * from ip_ban WHERE ip = "'.$_SERVER['REMOTE_ADDR'].'"') as $row) 
	{
		if(!empty($row)) 
		{ 
			header("Location: http://google.fr"); // Redirection
			exit();
			echo $ban_mess;
		}
	}

?>


--------------------------FORMULAIRE ADMIN------------------------------------
<?

// Connexion SQL (A supprimer lors d'une utilisation réelle puisqu'on suppose qu'elle est déjà faite)

$user = 'root';
$pass = '';

$dbh = new PDO('mysql:host=localhost;dbname=localhost', $user, $pass);

switch ($_GET['a']) 
	{
    		case 'ban': // Bannissement
       			// Verifications de la validité du formulaire
			if ($_POST['verif'] != '1') { echo '<span class="warn">Veuillez cocher la case de vérification de soumission du formulaire</span>'; }
			else 
				{
					$dbh->exec('INSERT INTO ip_ban (ip) VALUES ("'.$_POST['ip'].'")');
					echo 'L\'adresse IP ('.$_POST['ip'].') a correctement été bannie.';
				}
        		break;
    		case 'dban': // Debannissement
       			$dbh->exec('DELETE FROM ip_ban WHERE ip = "'.$_POST['ip'].'"');
			echo 'L\'adresse IP ('.$_POST['ip'].') a correctement été débannie.';
       		break;

	}


?>
 <!-- Exemple de Style -->
<style>
.warn { color: FF0000; }
</style>

<h5> Bannir une adresse IP </h5>
<form method=post action="?a=ban">
	<input type="text" name="ip" value="<? echo $_POST['ip']; ?>" size="11" maxlength="15" /><br />
	<label><input type="checkbox" name="verif" value="1" /><b>Êtes-vous sur(e)?</b> <span class="warn">/!\ Il s'agit d'une action lourde de conséquences.</span></label><br />
	<input type="submit" name="go" value="GO" />
</form>

<h5> Débannir une adresse IP </h5>
<form method=post action="?a=dban">
	<select name="ip" size="1">
  		<? 
		foreach ($dbh->query('SELECT * from ip_ban') as $row) // On va chercher les adresses déjà enregistrées pour les proposer comme choix
			{
				echo '<option value="'.$row['0'].'">'.$row['0'].'</option>';
			}
		?>
	</select>
	<input type="submit" name="go" value="GO" />
</form>

 Conclusion

Je ne pense pas que cette source soit mise à jour étant donnée sa simplicité.
Par contre, j'aimerais bien quelques petits commentaires, puisqu'il s'agit de ma première source! :D
En espérant qu'elle puisse vous êtes utiles. =)


 Sources du même auteur

GESTION D'ERREURS

 Sources de la même categorie

Source avec une capture PAGINATION EN PHP par Orangina
Source avec Zip POO - DEBUGGER par DiGhan
Source avec Zip CRAWLER DE SITE EN PHP par Mcjo
DÉCOUPAGE D'UN TEXTE EN FONCTION DES SAUTS DE LIGNES par biloubil
RÉCUPÉRER LE CHEMIN RELATIF D'UN OBJET PAR RAPPORT À LA RACI... par FredPsy

 Sources en rapport avec celle ci

Source avec Zip [PHP5.2] CLASSE PDO par hornetbzz
VERIFICATION D'UNE ADRESSE IP par cherifnet2002
Source avec Zip ABSTRACTION PDO par dorian91
Source avec Zip GESTIONNAIRE DE MODÈLES SQL par codefalse
Source avec Zip Source avec une capture ANTI ASPIRATEUR DE SITE (ENCORE UN MAIS DIFFERENT ) par dydjy940

Commentaires et avis

Commentaire de jdalton42 le 01/08/2007 18:40:55

suffit d'avoi une ip dynamique et ton truc est foutu...

Commentaire de coucou747 le 01/08/2007 19:52:14

#  exit();
# echo $ban_mess;
lol

jdalton, ca evite toujours les proxys...

Commentaire de Evangun le 01/08/2007 20:04:07

Hello,

outre le fait que cette source existe déjà en 50 exemplaires et n'a aucun intérêt, tu devrais au moins enregistrer la date pour effacer au fur et à mesure, sinon
1) tu vas exploser ta base
2) tu finiras par bloquer des gens qui ont récupéré l'adresse IP de quelqu'un d'autre

Commentaire de coucou747 le 01/08/2007 20:07:35

lol cote explosion de base... si c'etait de Mr sorel cette source, je comprendrais... mysql gere jusqu'a 2^32 lignes dans une myisam... ton hd craquera avant le sgbd, c'est ensuite la requette qui pourrait etre longue [...]

j'avais un truc qui enregistrait chaque demande de page, les arguments, le navigateur, etc... ca permet de voir plein plein de choses... au pire, si ca devient trop long, tu fais une db archive...

Commentaire de Evangun le 01/08/2007 20:41:59

Oui potentiellement ça peut être intéressant, mais moi les bases de 100Mo je ne peux plus les voir en peintures, surtout si c'est pour des informations aussi inutiles que bannir une IP... :)

Commentaire de Luzy le 01/08/2007 21:03:16

#  exit();
# echo $ban_mess;

Inversé les deux effectivement.

Quand à la taille de la base, je ne vois pas le problème, je me vois mal bannir des millier de personnes. Une dizaine d'entrée au maximum et voilà.

Commentaire de coucou747 le 01/08/2007 21:39:14

ban si tu ban tor et quelques proxys, t'en est a 10 000 ips en gros

Commentaire de malalam le 02/08/2007 09:29:03 administrateur CS

Hello,

bannir une IP est une pratique courante et parfois utile. Même si c'est loin d'être infaillible.
Et le risque de faire exploser la base me parait franchement minime, comme le dit Coucou. Les serveur de bdd sont costauds et supportent facilement plusieurs millions de lignes. Un insert, un delete, un select sur 1 seule ligne ne risquent pas non plus d'être lentes.
Là où je suis d'accord avec Evangun, c'est qu'il existe des tas de codes de ce genre sur PHPCS. Je le laisse pour une seule raison : il utilise PDO, ce qui est assez rare sur les sources ici; donc, ça a un intérêt.
Quelques remarques :
test du GET ?
Test de l'existence d'une IP dans la base avant de l'insérer (histoire d'éviter des doublons franchement inutiles).
PDO lance des exceptions lors d'erreurs, autant les utiliser. Un petit block try catch ne peut pas faire de mal.
PDO permet d'échapper les données en accord avec le moteur de bdd choisi...là encore, pourquoi ne te sers tu pas de cette possibilité (on ne sait jamais ce qui peut arriver sur ton code) ?

Commentaire de jdalton42 le 02/08/2007 12:00:38

bah moi quand je fais un ban sur mon site j'utilise l'ip, le login et l'adresse email.

quand le mec a changé d'ip et qu'il essaye de se logger, sa réenregistre l'ip et il est rebannis...

Commentaire de malalam le 02/08/2007 14:14:55 administrateur CS

Y a des mecs sur ton site qui quand ils sont bannis, tentent de revenir avec une IP différente, mais le même compte...? Sont pas très futés dis donc...;-)

Commentaire de TheSin le 02/08/2007 14:16:42

jdalton42 => Dans ce cas, pourquoi se servir de l'ip pour ban et pas simplement ban l'utilisateur ? (puisque login et email, juste à rajouter un champ booléen dans la table pour savoir si il est ban ou non non ?)

Commentaire de jdalton42 le 02/08/2007 14:29:08

je t'assure que la plupart des bannis le font ^^

Commentaire de jdalton42 le 02/08/2007 14:30:35

oui mais au moin, avec l'ip, il ne voit carrément plus le site... ensuite si son ip a changé et qu'il réutilise son compte, bah il voit de nouveau plus le site meme si il est pas loggé ! puis l'email est bannis des inscriptions :)

Commentaire de TheSin le 02/08/2007 17:30:13

bin qu'il n'utilise simplement plus son compte non ?
en bannissant une ip pour un membre puisque c'est bien de celà qu'il s'agit, tu peux bannir toutes les bécanes qui passent par le meme routeur/proxy, donc si son collègue est aussi sur le site au taff, y'a pas un peu problème ?

Commentaire de apxa le 04/08/2007 02:14:20

iop all,
Juste pour info, si tu veux bannir une IP ou un mask d'IP sans requeter alors ecris direct dans le hosts.deny. C'est radical, pas de requetes.
De plus ...

Have Fun ;)

Commentaire de coucou747 le 04/08/2007 11:00:12

/etc/hosts.deny n'est pas forcement accessible en ecriture par php ou autre...

Commentaire de MATHIS49 le 05/08/2007 08:46:43

Par expérience seul un système de modération efficace empêche les internautes de mettre le bordel sur un site.
Le problème du bannissement IP est que si l'internaute est par exemple derrière un routeur en PAT, tu risques de bannir plusieurs personnes au lieu d'une...

Commentaire de TheSin le 05/08/2007 09:56:37

Mathis49 => C'est en partie ce que je disais, en mieux dit :-)

Commentaire de apxa le 05/08/2007 12:02:46

iop all,
oui il est vrai pour hosts.deny.
Mais il reste alors .htaccess

Options +FollowSymLinks
order allow,deny
deny from IP or Mask
allow from all

Have Fun ;)

Commentaire de jdalton42 le 05/08/2007 13:04:25

bah le gars empechera son réseau d'y acceder, c'est son probleme, il n'aura cas s'arranger avec eu...

perso je me suis fais bannir de cannavallee.com pour multicompte alors que je n'ai qu'un compte... mais mon frere s'est connecté juste apres moi sur son compte... j'ai envoyé un mail a l'admin du site mais il s'en fou...

Commentaire de TheSin le 05/08/2007 20:49:35

jdalton42 => En général faut prévenir les admins avant de faire ce multicomptes, mais bon, c'est sur que la plupart s'en fiche, ils sont pas forcément tous professionnels dessus et développent des trucs pour se faire un peu d'argent ou pour le fun et ils ont autre chose à côté ^^
Mais c'est sûr que ce n'est pas la solution que de bannir une IP, mais le ban pour multicomptes avec vérification IP, on a pas trop le choix, je vois pas comment faire autrement ....... et c'est fort dommage :/

Commentaire de coucou747 le 05/08/2007 22:27:26

on ne peut pas faire autrement... ici, on croise un type sur une ip, il a plusieurs pseudos ici, et on l'a croise sur irc avec une bonne vingtaine de pseudos et d'histoires delirantes... mais il aide bien, alors bon...

Commentaire de TheSin le 06/08/2007 00:26:00

Oui, mais dans l'entraide ou le chat, on se fiche royal d'un multi-comptes, ça ne peut poser préjudice à personne, tandis que sur un jeu, il est normal de supprimer les tricheurs qui possèdent plusieurs comptes et qui par conséquent peuvent gérer l'équivalent d'une équipe complète ... alors bon ... :P
Ce qui serait utile par contre serait de pouvoir récupérer l'IP locale en + de l'IP Internet, mais là encore, en espace public, c'est difficille.
Et justement, tient, prenons l'exemple basique des joueurs de cyber-café, ils y a forcément détectage d'une seule IP pour plusieurs comptes sur un même site, dans le cas où, évidemment, plusieurs personnes en même temps s'y retrouveraient connectées.
C'est dans ce genre de situations où il n'est malheuresement pas possible de se fier au bannissement IP ...
N'oublions pas que nos chers ordinateurs dit "PC" ne le sont plus depuis longtemps puisque qu'un ordinateur est aujourd'hui prévu pour plusieurs utilisateurs.
Là, même l'IP locale n'est pas fiable.
Bref, j'en reviens toujours au même point de vue, arrêtons les bannissements IP, même pour les robots.
Pour les aspirateurs de sites, il me semble qu'il existe des solutions basiques à cet effet, pour des membres, il existe simplement une solution de booléen dans la BDD, pour les robots, ils ont générallement le nom de domaine, et dans le pire des cas, il existe encore simplement la même solution que les aspirateurs.
Non ?

(Si jme trompe, dites-le moi, j'aime bien quand on me remet les choses en place quand il le faut ;-) )

Commentaire de coucou747 le 06/08/2007 08:03:03

si tu te faisais attaquer sur irc, tu serais d'un autre avis... pour moi, une ip de proxy -> ban, une ip perso d'un connard -> ban, si il debranche son routeur pour revenir -> ban large... (j'ai vu des admins qui posaient des bans sur tout un FAI...)

Commentaire de TheSin le 06/08/2007 09:07:27

oui, mais encore, celà ne reste que le cas d'IRC, et entre une appli graphique et une appli Web y'a un monde ....
moi j'essaie de rester dans le cadre d'une appli Web, conctrètement, on a pas besoin de ban une IP quand même, à moins de pas la ban plus de 24h à cause d'IP dynamique.
Je me souviens il y a 2 ans, jme ballaidais tous les jours sur un site Web, à un moment, après reconnexion FAI, bin plus accès au site avant prochaine reconnexion, car IP bannie.
Quand tu bannis une IP sur le net, c'est pas qu'une seule personne que tu peux bannir, c'est pas non plus simplement une pièce, c'est une série de personnes distinctes dont 1 seule à fait qqc de mal ....
C'est pour ça que je ne supporte pas le bannissement par IP sur de l'application Web.

Commentaire de guill76 le 06/08/2007 20:13:50

ouais , interessant comme polémique tout ça.
Moi je suis plutot également pour le banissement de compte:
D'ailleurs, c'est en extrapolant, un peu comme le prof qui punit toute la classe quand le cancre fauteur ne veut pas se dénoncer lui même: j'avais horreur de ça à l'époque.
Certes s'il faut punir ou bannir, bien évidemment bannissons le compte pas l'adresse ip ni le fournisseur.
Pour info je suis pratiquement sûr que lequipe.fr avait banni tout aol pendant plusieurs mois l'année dernière => toutes les tentatives restaient vaines depuis 1 connexion aol irreprochable: lamentable.
Donc même si ça existe restons pour une administration web générale permissive et pour favoriser une responsabilisation de chacun.
Dans le cas des attaques à mon avis les admins des FAI devraient pouvoir agir et bloquer certaines connexions chez eux, s'ils pouvaient être alertés par les admins web avec raison valable(toutes les connexions doivent être historisées pendant un laps de temps, eux savent à qui appartient l'ip qui s'est connectée à tel site à tel moment). Dans ce cas, c'est vrai que pour les attaques émanant des cybercafés c'est plus dur, là c'est à l'administrateur du cybercafé de jouer. Enfin bon, pour poursuivre la réflexion s'il faut faire tout un cycle de delation et de flicage là ça peut devenir aussi dangereux pour les libertés de chacun...
Pour conclure, Il faudrait et c'est peut-être le plus dur avoir des admins responsables pour cela (aucune allusion à CS à ce sujet :))

Commentaire de guill76 le 06/08/2007 20:13:51

ouais , interessant comme polémique tout ça.
Moi je suis plutot également pour le banissement de compte:
D'ailleurs, c'est en extrapolant, un peu comme le prof qui punit toute la classe quand le cancre fauteur ne veut pas se dénoncer lui même: j'avais horreur de ça à l'époque.
Certes s'il faut punir ou bannir, bien évidemment bannissons le compte pas l'adresse ip ni le fournisseur.
Pour info je suis pratiquement sûr que lequipe.fr avait banni tout aol pendant plusieurs mois l'année dernière => toutes les tentatives restaient vaines depuis 1 connexion aol irreprochable: lamentable.
Donc même si ça existe restons pour une administration web générale permissive et pour favoriser une responsabilisation de chacun.
Dans le cas des attaques à mon avis les admins des FAI devraient pouvoir agir et bloquer certaines connexions chez eux, s'ils pouvaient être alertés par les admins web avec raison valable(toutes les connexions doivent être historisées pendant un laps de temps, eux savent à qui appartient l'ip qui s'est connectée à tel site à tel moment). Dans ce cas, c'est vrai que pour les attaques émanant des cybercafés c'est plus dur, là c'est à l'administrateur du cybercafé de jouer. Enfin bon, pour poursuivre la réflexion s'il faut faire tout un cycle de delation et de flicage là ça peut devenir aussi dangereux pour les libertés de chacun...
Pour conclure, Il faudrait et c'est peut-être le plus dur avoir des admins responsables pour cela (aucune allusion à CS à ce sujet :))

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

IP variable et url fixe [ par omnikod ] Vous avez une connexion ADSL ?Vous avez un serveur Web ?Vous avez une IP dynamique et vous voulez pouvoir acceder à votre site par une adresse du styl Tri d'IP... [ par echo200 ] Bonjour,En php, est-il possible de "trier" les ip authorisés à visitter un site web (définis selon nos critères), et d'éventuellement bannire les impo Passer de dév en prod [ par iubito ] Bjour tout le monde!J'ai besoin de votre aide car j'sais pas faire, euh... c'est la première fois que j'le fais.J'ai un serveur web sur Linux sur l'In Adresse ip [ par kwak ] Bonjour à tous,je ne comprends pas très bien pourquoi la valeur de $REMOTE_ADDR change continuellement dans ce script quand je l'execute:&lt;?print("V php : lire fichier txt, comparer heure et choix liens [ par drominik ] voila,j'ai dans un fichier txt, l'ip du visiteur et l'heure de sa visite,et j'aimerais a chaque visiteur pouvoir aller lire le fichier txt, et compare comment diffencier 2 PC d'un reseau (meme ip) ? [ par EnDSuB ] http://endsub.free.fr voila, j'aimerai savoir comment diffencier 2 PC d'un reseau (meme ip) sans cookies ni sessions , est ce possible?< connection mysql par script [ par boin ] Imaginons que je veuille acceder a une base mysql par un script php pour y faire des tas de modifs si ça me chante.Donc j'ai un Host pour acceder a ph du MultiPlayer dans l'aire [ par Nestor ] SalutJe voudrais me faire sous forme de tableau un listing d'adresse ip, du ping, date, heure.....pour mon site mais je sauré jamais faire cela en php PROTOMAIL [ par Tomcube ] Salut !Je crée ce topic pour permettre d'améliorer Protomail qui serait vraiment utile pour les Freenautes. On pourrais se partager les tests qu'on a mysql dernier entrer [ par titiseb28 ] Bonjour je voudrait savoire comment faire pour affiche la derniere entrer d'une table mysql ??dans ma table g 2 champ un ip(adresse ip) et l'autre dat


Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,108 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales