Interdire un pays dans votre site

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 307 fois - Téléchargée 27 fois

Contenu du snippet

Astuce : Interdire l'accès d'un pays à votre site

Utilitée : Imaginer que pour des raisons privées ou professionelle, vous ne souhaitez pas qu'un pays ai accès à votre site.

Origine du CSV : http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
Taille en base de données : 5.5 Mo

Source / Exemple :


/// ---------------------------------------------------------------------------
//  BLINCKERS© Groups
/// ---------------------------------------------------------------------------
//  Kill Country 
//  Version : 
//  - 1.0 | 29/08/2002 
//  - 2.0 | 31/03/2010 - refonte intégrale
//
//  McPeter - http://www.blinckers-groups.com
/// ---------------------------------------------------------------------------

// Fichier de connexion à la base de données: dbaccess.php

<?php
// Connection Base de données
function dbAccess ()
{
  $DB_host = 'localhost';
  $DB_user = 'my_user';
  $DB_pass = 'my_pass';
  $DB_base = 'my_db';

  @$db_id = mysql_connect($DB_host, $DB_user, $DB_pass) or die ("ERREUR: Impossible de se connecter à la base de données !");
  @mysql_select_db ($DB_base, $db_id) or die ("ERREUR: Impossible d'accèder à la base de données !");
  @mysql_query ("SET NAMES 'utf8'" );
}
?>

// Fichier pour l'importation du CSV en base de données : extract_ip2country.php

<?php
/// ---------------------------------------------------------------------------
//  Extraction des données CSV et insertion en base de données
//  Origine du CSV : 
//    http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
//  Nom du fichier :
//    extract_ip2country.php
/// ---------------------------------------------------------------------------

@require ('dbaccess.php');
dbAccess ();

// Création de la table
mysql_query ("
  CREATE TABLE if not exists `ip2country` (
    `ip_from` int(10) unsigned NOT NULL,
    `ip_to` int(10) unsigned NOT NULL,
    `code` varchar(2),
    `country` varchar(50),
    INDEX (`ip_from`),
    INDEX (`ip_to`)
  )
"); 

// Insertion des données
mysql_query ("
  LOAD DATA LOCAL INFILE 'GeoIPCountryWhois.csv' INTO TABLE `ip2country` 
  FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' 
  (@dummy, @dummy, `ip_from`, `ip_to`, `code`, `country`)
");

/// ---------------------------------------------------------------------------
//  Si la fonction 'LOAD DATA LOCAL INFILE' est inopérande chez vous, utilisez
//  le code suivant (beaucoup plus lent)
/// ---------------------------------------------------------------------------

/*if (($ip2countrycsv = fopen ("GeoIPCountryWhois.csv", "r")) !== FALSE):
  while (($ip2country = fgetcsv ($ip2countrycsv, 1000, ",")) !== FALSE):
    list ($step1, $step2, $ip_from, $ip_to, $code, $country) = $ip2country;
    mysql_unbuffered_query (
      "INSERT INTO `ip2country` (`ip_from`,`ip_to`,`code`,`country`) 
        VALUES (
                '".mysql_real_escape_string($ip_from)."', 
                '".mysql_real_escape_string($ip_to)."', 
                '".mysql_real_escape_string($code)."', 
                '".mysql_real_escape_string($country)."'
        )"
    );
  endwhile;
endif;*/
?>

// Fichier pour trouver le pays de votre visiteur : kill_country.php

<?php
// Recherche de l'ip du visiteur
function get_ip ()
{
  if (isset($_SERVER)):
    if (isset ($_SERVER['HTTP_X_FORWARDED_FOR']))
      $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    elseif (isset ($_SERVER['HTTP_CLIENT_IP']))
      $ip = $_SERVER['HTTP_CLIENT_IP'];
    else
      $ip = $_SERVER['REMOTE_ADDR'];
  else:
    if (getenv ('HTTP_X_FORWARDED_FOR'))
      $ip = getenv ('HTTP_X_FORWARDED_FOR');
    elseif (getenv ('HTTP_CLIENT_IP'))
      $ip = getenv ('HTTP_CLIENT_IP');
    else
      $ip = getenv('REMOTE_ADDR');
  endif;

  return $ip;
}

// Recherche du pays
function checkCountry ($ip)
{
  @require ('dbaccess.php');
  dbAccess ();
  $result = mysql_query ("SELECT `country` FROM `ip2country` WHERE INET_ATON('$ip') BETWEEN `ip_from` AND `ip_to`");
  return ($result && mysql_num_rows ($result)==1) ? mysql_result ($result, 0, 'country') : FALSE;
}

// Vérification
function kill_country ($str)
{
  //  -------------------------------------------------------------------------
  //  Retour au choix : 
  //  - die ('message');
  //  - header ('Location:$URL'); exit();
  //  -------------------------------------------------------------------------
  if (preg_match ('#(?:'.$str.')#i', checkCountry (get_ip ()))):
    die ('Accès refusé');
  endif;
}
?> 

// Maintenant, il vous suffit d'utiliser le code suivant dans toutes les pages que vous
// voulez interdire. 

<?php
@require ('kill_country.php');

// Refuser 'un' pays
kill_country ('france');

// Refuser une série de pays
kill_country ('france|germany|switzerland');
?>

Conclusion :


Le Zip contient l'ancienne version (texte) du source posté ici en 2002, et les différents fichiers se trouvant dans le code ci-dessus.

Je voulais envoyer le zip .. mais il semble que ça ne fonctionne pas ...

A voir également

Ajouter un commentaire

Commentaires

Messages postés
4
Date d'inscription
mercredi 21 octobre 2009
Statut
Membre
Dernière intervention
26 mars 2010

bonjour je tente de laisser l'accée qu'a deux pays pour un site j'ai donc fait ceci dans kill-country

mais cela ne semble pas fonctionner ? quelqu'un peut t'il m'aider ?

// Ici indiquer les pays à autoriser
if (trim(IpEnPays()) != "FRANCE" OR trim(IpEnPays()) != "BELGIUM")
{
// Ca c'est pour la blague .. mais il suffit de mettre "die;" à la fin de la condition
header("Location:http://www.wanadoo.fr");
}
Messages postés
4
Date d'inscription
mercredi 21 octobre 2009
Statut
Membre
Dernière intervention
26 mars 2010

Bonjours a tous

très bonne idée j'ai besoin de le faire fonctionner pour éviter que certains pays servant de support au attaque arrive sur mon serveur.
j'ai pas réussis a mettre en place le .csv du site officiel , le bout de programme donné plus haut ne semble pas fonctionné chez moi ?
je me suis donc tourné vers l'url du sql fournis mais qui manque d'une mise a jours ( date de 2007 ) si quelqu'un avais la bonté de nous fournir un sql a jours ?

j'ai creer un fichier php de test avec l'appel <? include("kill_country.php"); ?>
et dans le fichier kill_country.php j'ai copier coller et mis mes donné d'accée a ma base de donnée.

cela fonctionne bien pour l'interdiction d'un pays mais comment je doit faire pour interdire plusieurs pays ? j'ai une liste de 10 pays banni de mon serveur

merci de votre aide

David
Messages postés
136
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
18 avril 2013

les plages d'adresses ip de neuf et cegetel ne sont peu être pas dans la base de données actuelle. il faut donc régulièrement mettre à jour la base de données des correspondances ip<->pays.

J'indique la procédure dans la première partie du code.
c.f.:
// Le fichier pour enregistrer le fichier *.CVS dans votre base :
Messages postés
19
Date d'inscription
samedi 21 juin 2003
Statut
Membre
Dernière intervention
5 janvier 2009

Salut McPeter,

Qu'est-ce que tu veux dire par là ?
Messages postés
136
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
18 avril 2013

faut peu être que je fasse une nouvelle mise à jour de la DB :p (mais vous pouvez le faire vous aussi :) )
Afficher les 32 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.