|
|
@@ -0,0 +1,83 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+class blacklist {
|
|
|
+
|
|
|
+ private static $log_file = '../blacklist/ip_attempts.log';
|
|
|
+ private static $blacklist_file = '../blacklist/ip.txt';
|
|
|
+ private static $max_attempts = 5;
|
|
|
+ private static $time_window = 10 * 60; // 10 minutes en secondes
|
|
|
+
|
|
|
+ public static function execute(?string $_from = NULL) {
|
|
|
+ self::check($_from);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function isValidIPv4() {
|
|
|
+ return filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static function getFullUrl() { $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://';
|
|
|
+ return $protocol . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
|
|
|
+ }
|
|
|
+
|
|
|
+ private static function readBalcklist(){ // Charger les tentatives existantes
|
|
|
+ $attempts = [];
|
|
|
+ if (file_exists(self::$log_file)) {
|
|
|
+ $lines = file(self::$log_file, FILE_IGNORE_NEW_LINES);
|
|
|
+ foreach ($lines as $line) {
|
|
|
+ list($ip, $timestamp) = explode(',', $line);
|
|
|
+ $attempts[] = ['ip' => $ip, 'timestamp' => strtotime($timestamp)];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $attempts;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static function checkBlacklist(string $_ip){ // Vérifier si l'IP est déjà blacklistée
|
|
|
+ $blacklisted = FALSE;
|
|
|
+ if (file_exists(self::$blacklist_file)) {
|
|
|
+ $blacklisted_ips = file(self::$blacklist_file, FILE_IGNORE_NEW_LINES);
|
|
|
+ $blacklisted = in_array($_ip, $blacklisted_ips);
|
|
|
+ }
|
|
|
+ return $blacklisted;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static function addBalcklist(string $_ip){ // Ajouter une nouvelle tentative
|
|
|
+ file_put_contents(self::$log_file, "$_ip," . date('Y-m-d H:i:s') . ", " . $_SERVER["REQUEST_METHOD"] . "," . self::getFullUrl() . "\n", FILE_APPEND);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static function check(){ // Compter les tentatives récentes
|
|
|
+ $now = time();
|
|
|
+ $time_window = self::$time_window;
|
|
|
+ $attempts = self::readBalcklist();
|
|
|
+ $ip = $_SERVER['REMOTE_ADDR'];
|
|
|
+ $blacklisted = self::checkBlacklist($ip);
|
|
|
+
|
|
|
+ self::addBalcklist($ip);
|
|
|
+
|
|
|
+ $recent_attempts = array_filter($attempts, function ($attempt) use ($ip, $now, $time_window) {
|
|
|
+ return $attempt['ip'] === $ip && ($now - $attempt['timestamp']) <= $time_window;
|
|
|
+ });
|
|
|
+
|
|
|
+ if (count($recent_attempts) + 1 > self::$max_attempts && !self::checkBlacklist($ip)) {
|
|
|
+ file_put_contents(self::$blacklist_file, "$ip\n", FILE_APPEND);
|
|
|
+ $blacklisted = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($blacklisted == TRUE) {
|
|
|
+ header('HTTP/1.0 401 Unauthorized');
|
|
|
+ echo "Votre IP (" . $ip . ") a été blacklistée pour trop de tentatives.";
|
|
|
+ exit();
|
|
|
+ } else {
|
|
|
+ echo "Votre IP est : " . $ip . ". Nombre de tentatives récentes : " . (count($recent_attempts) + 1);
|
|
|
+ exit();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function itIs(){ // Est-il blacklisté
|
|
|
+ $ip = $_SERVER['REMOTE_ADDR'];
|
|
|
+ if(self::checkBlacklist($ip)){
|
|
|
+ echo "Votre IP (" . $ip . ") a été blacklistée pour trop de tentatives.";
|
|
|
+ exit();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|