/*---------------------------------------------------------------*/
|
/*
|
Titre : Bloque dynamiquement des IP hack et stocker ces IP dans des fichiers
|
|
URL : https://phpsources.net/code_s.php?id=582
|
Auteur : forty
|
Website auteur : http://www.toplien.fr/
|
Date édition : 03 Avril 2010
|
Date mise à jour : 29 Aout 2019
|
Rapport de la maj:
|
- fonctionnement du code vérifié
|
*/
|
/*---------------------------------------------------------------*/
|
|
/* les 4 lignes suivantes sont à ajouter dans le fichier .htaccess :
|
#bloque l'accès au site suite à l'abus d'une adresse IP
|
RewriteCond %{DOCUMENT_ROOT}/cache_ip_bl/%{REMOTE_ADDR}.html -f
|
RewriteCond $1 !^cache_ip_bl/
|
RewriteRule ^(.*)$ /cache_ip_bl/%{REMOTE_ADDR}.html [L]
|
*/
|
|
?>
|
<?php
|
// ce chemin est à adapter en fonction de vos besoins et doit rester
|
// cohérent
|
// avec ce qui est déclaré dans le fichier .htaccess
|
define('DIR_CACHE_IP_BL', $_SERVER['DOCUMENT_ROOT'] . '/cache_ip_bl');
|
|
// Le code ci-dessous est une adaptation du script visible ici :
|
// http://www.phpsources.org/ressources-securite-php171.htm
|
// il faut donc installer ce script au préalable puis remplacer la fonction
|
// controle_ip() et ajouter les deux autres : get_ip_bl_cache_name() et
|
// sauve_ip_b
|
//l_cache()
|
|
// détermine le chemin d'un fichier cache pour bloquer une IP
|
function get_ip_bl_cache_name($ip = '') {
|
$ip_tmp = (empty($ip) ? $_SERVER['REMOTE_ADDR'] : $ip);
|
return DIR_CACHE_IP_BL . '/' . $ip_tmp . '.html';
|
}
|
|
// sauvegarde un fichier cache pour bloquer une IP
|
function sauve_ip_bl_cache($texte, $ip = '') {
|
if (empty($ip)) {
|
@create_file(get_ip_bl_cache_name(), $texte .
|
'Les adresses IP utilisant trop de ressources ou accédant à des pages' .
|
' protégées sont bloquées pour concentrer les ressources disponibles' .
|
' sur' .
|
' les visiteurs normaux du site.');
|
} else {
|
@create_file(get_ip_bl_cache_name($ip), $texte .
|
'Les adresses IP utilisant trop de ressources ou accédant à des pages' .
|
' protégées sont bloquées pour concentrer les ressources disponibles' .
|
' sur' .
|
' les visiteurs normaux du site.');
|
}
|
}
|
|
// contrà´le qu'une adresse IP ne charge pas trop de pages par minute ou trop
|
// de
|
// pages interdites
|
function controle_ip($erreur401 = false) {
|
$date_time_array = getdate();
|
$hours = $date_time_array['hours'];
|
$minutes = $date_time_array['minutes'];
|
$seconds = $date_time_array['seconds'];
|
$month = $date_time_array['mon'];
|
$day = $date_time_array['mday'];
|
$year = $date_time_array['year'];
|
$date = date('Y/m/d H:i', mktime($hours, $minutes, $seconds, $month, $day-1,
|
$year));
|
$date_as = my_mysql_real_escape_string($date);
|
$sql_ip = "DELETE FROM ip WHERE date < '$date_as' ";
|
$res_ip = my_mysql_query($sql_ip);
|
|
$domaine = gethostbyaddr($_SERVER['REMOTE_ADDR']);
|
$ip_as = my_mysql_real_escape_string($_SERVER['REMOTE_ADDR']);
|
$domaine_as = my_mysql_real_escape_string($domaine);
|
$date = date('Y/m/d H:i');
|
$date_as = my_mysql_real_escape_string($date);
|
$ua_as = my_mysql_real_escape_string(empty($_SERVER['HTTP_USER_AGENT'])?'':
|
$_SERVER['HTTP_USER_AGENT']);
|
$sql_ip = "SELECT * FROM ip WHERE ip = '$ip_as' ";
|
$res_ip = my_mysql_query($sql_ip);
|
if (($res_ip = mysql_fetch_array($res_ip,MYSQL_ASSOC)) !== false) {
|
if ($erreur401) {
|
$cpt_401 = $res_ip['cpt_401'] + 1;
|
if ($cpt_401 >= LIMITE_401) {
|
$cpt = $res_ip['cpt'];
|
$cpt_as = my_mysql_real_escape_string($cpt);
|
$cpt_401_as = my_mysql_real_escape_string($cpt_401);
|
sauve_ip_bl_cache('Vous avez visualisé plus de ' . LIMITE_401
|
.
|
' pages protégées. ');
|
//creation des messages
|
$message_erreur = '<font color="#ff0000">';
|
$message_erreur .= 'IP bannie car ' . LIMITE_401 .
|
' erreurs de mot de passe : ' . $_SERVER['REMOTE_ADDR'] . '</font><br><br>';
|
$url_erreur_complete = get_complete_url();
|
$message_erreur .= 'Voici l\'url source : <a href="' .
|
htmlspecialchars($url_erreur_complete) . '">' . $url_erreur_complete .
|
'</a><br><br>';
|
if (isset($_SERVER['HTTP_REFERER'])) {
|
$message_erreur .= 'Voici la page d\'origine : <a href="' .
|
htmlspecialchars($_SERVER['HTTP_REFERER']) . '">' . $_SERVER['HTTP_REFERER'] .
|
'</a><br><br>';
|
}
|
if (isset($_SERVER['HTTP_USER_AGENT'])) {
|
$message_erreur .= 'Navigateur : ' . $_SERVER[
|
'HTTP_USER_AGENT'] . '<br><br>';
|
}
|
$message_erreur .= 'Nom de domaine : ' . $domaine . '<br><br>';
|
$message_erreur .= '<a href="http://' . $_SERVER['HTTP_HOST'] .
|
CHEMIN_RACINE . 'admin/ip_bloque.php?ip=' . urlencode($_SERVER['REMOTE_ADDR']) .
|
'">Débloquer</a><br><br>';
|
//envoi du message eu webmaster pour le prevenir de l'erreur
|
send_mail('IP bannie', $message_erreur);
|
header('Status: 403 Forbidden', false, 403);
|
die('IP interdite pour abus.');
|
} else {
|
$sql_ip =
|
"UPDATE ip SET cpt_401=cpt_401+1, date='$date_as', ua='$ua_as'," .
|
" domaine='$domaine_as' WHERE ip='$ip_as' ";
|
$res_ip = my_mysql_query($sql_ip);
|
}
|
} elseif ($res_ip['date'] == $date) {
|
$cpt = $res_ip['cpt'] + 1;
|
if ($cpt >= LIMITE_404) {
|
$cpt_401 = $res_ip['cpt_401'];
|
$cpt_as = my_mysql_real_escape_string($cpt);
|
$cpt_401_as = my_mysql_real_escape_string($cpt_401);
|
sauve_ip_bl_cache('Vous avez visualisé plus de ' . LIMITE_404
|
.
|
' pages inexistantes en une minute. ');
|
//creation des messages
|
$message_erreur = '<font color="#ff0000">';
|
$message_erreur .= 'IP bannie car plus de ' . LIMITE_404 .
|
' requêtes en 1 minute : ' . $_SERVER['REMOTE_ADDR'] . "</font><br><br>";
|
$url_erreur_complete = get_complete_url();
|
$message_erreur .= 'Voici l\'url source : <a href="' .
|
htmlspecialchars($url_erreur_complete) . '">' . $url_erreur_complete .
|
'</a><br><br>';
|
if (isset($_SERVER['HTTP_REFERER'])) {
|
$message_erreur .= 'Voici la page d\'origine : <a href="' .
|
$_SERVER['HTTP_REFERER'] . '">' . $_SERVER['HTTP_REFERER'] . '</a><br><br>';
|
}
|
if (isset($_SERVER['HTTP_USER_AGENT'])) {
|
$message_erreur .= 'Navigateur : ' . $_SERVER[
|
'HTTP_USER_AGENT'] . '<br><br>';
|
}
|
$message_erreur .= 'Nom de domaine : ' . $domaine . '<br><br>';
|
$message_erreur .= '<a href="http://' . $_SERVER['HTTP_HOST'] .
|
CHEMIN_RACINE . 'admin/ip_bloque.php?ip=' . urlencode($_SERVER['REMOTE_ADDR'])
|
. '">Débloquer</a><br><br>';
|
send_mail('IP bannie', $message_erreur);
|
header('Status: 403 Forbidden', false, 403);
|
die('IP interdite pour abus.');
|
} else {
|
$sql_ip =
|
"UPDATE ip SET cpt=cpt+1, date='$date_as', ua='$ua_as', domaine='$domaine_as'" .
|
" WHERE ip='$ip_as' ";
|
$res_ip = my_mysql_query($sql_ip);
|
}
|
} else {
|
$sql_ip =
|
"UPDATE ip SET cpt=1, date='$date_as', ua='$ua_as', domaine='$domaine_as'" .
|
" WHERE ip='$ip_as' ";
|
$res_ip = my_mysql_query($sql_ip);
|
}
|
} else {
|
if ($erreur401) {
|
$cpt = 0;
|
$cpt_401 = 1;
|
} else {
|
$cpt = 1;
|
$cpt_401 = 0;
|
}
|
$cpt_as = my_mysql_real_escape_string($cpt);
|
$cpt_401_as = my_mysql_real_escape_string($cpt_401);
|
$sql_ip =
|
"INSERT into ip (ua, ip, domaine, date, cpt, cpt_401) values ('$ua_as'," .
|
" '$ip_as', '$domaine_as', '$date_as', '$cpt_as', '$cpt_401_as')";
|
$res_ip = my_mysql_query($sql_ip);
|
}
|
}
|
|
?>
|
|
|