TheRec
jeudi 6 octobre 2005 à 08:17
Il faut récupérer l'adresse IP de ton visiteurs ... j'utilise ceci :
CODE
/**
* Determin if an IP address is valid or not
*
* @date 2005-04-02
* @param string $ip IP address to test
* @return bool true = valid, false= not valid
*/
function is_ip_address($ip) {
if(is_string($ip) && ereg('^([0-9]{1,3})\.([0-9]{1,3})\.' .
'([0-9]{1,3})\.([0-9]{1,3})$',
$ip, $part)) {
if($part[1] <= 255 && $part[2] <= 255 &&
$part[3] <= 255 && $part[4] <= 255)
return true;
}
return false;
}
/**
* Determin if an IP address is valid on INTERNET or not
*
* @date 2005-04-02
* @param string $ip IP address to test
* @return bool true = valid, false= not valid
*/
function valid_internet_ip($ip) {
if(!empty($ip) && ip2long($ip)!=-1)
{
$reserved_ip = array (
array('0.0.0.0','2.255.255.255'),
array('10.0.0.0','10.255.255.255'),
array('127.0.0.0','127.255.255.255'),
array('169.254.0.0','169.254.255.255'),
array('172.16.0.0','172.31.255.255'),
array('192.0.2.0','192.0.2.255'),
array('192.168.0.0','192.168.255.255'),
array('255.255.255.0','255.255.255.255')
);
foreach ($reserved_ip as $r)
{
$min = ip2long($r[0]);
$max = ip2long($r[1]);
if((ip2long($ip) >= $min) && (ip2long($ip) <= $max)) return false;
}
return true;
}
else return false;
}
/**
* Determin if an IP address is banned in the database
*
* @date 2005-04-02
* @param string $ip IP address to test
* @return bool true = banned, false= not banned
*/
function is_ip_banned($ip) {
$longip = ip2long($ip);
if($longip != -1) {
$result = mysql_query("SELECT * FROM failedauth WHERE (".$longip." BETWEEN First_IP AND Last_IP) AND banned");
return mysql_num_rows($result) != 0;
} else {
return true;
}
}
/**
* Find the IP address of the user
*
* @date 2005-04-02
* @return string IP address
*/
function get_ip() {
if(valid_internet_ip($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
} elseif($_SERVER['HTTP_X_FORWARDED_FOR']!="") {
$forwarded=str_replace(",","",$_SERVER['HTTP_X_FORWARDED_FOR']);
$forwarded_array=split(" ",$forwarded);
foreach($forwarded_array as $value) {
if(valid_internet_ip($value)) {
return $value;
}
}
}
return $_SERVER['REMOTE_ADDR'];
}
/**
* Determin if a string is a FQDN
*
* @date 2005-04-02
* @param string $host Host to test
* bool $force_dot Force do in the address
* @return bool true = valid, false= not valid
*/
function check_fqdn($host, $force_dot=false) {
if(!ereg("^\[?[0-9\.]+\]?$", $host)) { // Check if domain is IP
$fqdn = explode(".", $host);
if(count($fqdn) < 2) {
return false;
}
for ($i = 0; $i < count($domain_array); $i++) {
if(!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $fqdn[$i])) {
return false;
}
}
return true;
}
return false;
}
/**
* Find the hostname of the user from his IP address
*
* @date 2005-04-02
* @param string $ip The IP address to lookup
* @return string Hostname of the user or IP if failed to get it
*/
function get_host($ip) {
if(preg_match("|win|i",PHP_OS)) {
$runext = exec("nslookup -timeout=2 -retry=1 $ip", $output, $error); // Now works on windows
if(!$error){
$resolved = split(":",$output[3]);
if(check_fqdn($resolved[1])) {
return trim($resolved[1]);
}
}
} else {
$output = `host -W 2 $ip`;
if(ereg(".*pointer ([A-Za-z0-9.-]+)\..*",$output,$regs)) {
return $regs[1];
}
}
return $ip;
}
Note que la fonction "is_ip_banned", correspond à une implémentation particulière et que tu devra la canger pour ton cas. Dans mon cas la table "failedauth" contient deux champs afin de pouvoir spécifier une plage (range) d'adresse IP. Je te conceille de garder cette implémentation, elle peut te servir si par exemple tu veux vérouiller une plage d'addresse manuellement...
Note également que les adresses IP sont converties en entier long avec la fonction ip2long(), c'est la méthode la plus logique pour ce cas... mais de tout façon je me voyais mal stocker les adresse IP sous forme de chaîne de caractères ce n'est pas cohérent...
Le principe est le suivant, tu stockes une ligne dès la première tentative ayant échoué, avec un compteur de tentative pour cette IP et un champ "banned". A chaque tentative erronée, tu vérifies avant d'ajouter cette enregistrement qu'il n'y en ait pas déjà un pour l'adresse IP de l'utilisateur. Si c'est le cas tu incérmentes son compteur, ce pour chaque tentative erronnée jusqu'à ce que la limite que tu fixe soit atteinte ou que l'adresse IP en question ait réussit une tentative. Une fois la limite atteinte tu définit le champ "banned" à "TRUE" (par défaut il doit être à false).
Ensuite lors de l'acès au formulaire d'identification, il faut vérifier l'adresse IP de l'utilisateur avant d'afficher le formulaire.
Voilà...à toi de coder un peu

Toutefois soit conscient du fait que n'importe quel pirate un tant soit peu "compétant" se munit d'une liste rotative de proxy pour attaquer un site, non seulement pour se protéger (généralement des proxy non_transparents) et également pour ne pas déclancher ce genre de système de sécurité... (moi aussi je m'habillerais en noir pour faire un cambriolage de nuit

)