1. PHP / Говнокод #28113

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    // Проверка активных ip-адресов
    $is_active = false;
    if ($dir = opendir($path_active)) {
        while (false !== ($filename = readdir($dir))) {
            // Выбирается ip + время активации этого ip
            if (preg_match('#^(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})_(\d+)$#', $filename, $matches)) {
                if ($matches[2] >= time() - self::intervalSeconds) {
                    if ($matches[1] == $ip_address) {
                        $times = intval(trim(file_get_contents($path_active . $filename)));
                        if ($times >= self::intervalTimes - 1) {
                            touch($path_block . $filename);
                            unlink($path_active . $filename);
                        } else {
                            file_put_contents($path_active . $filename, $times + 1);
                        }
                        $is_active = true;
                    }
                } else {
                    unlink($path_active . $filename);
                }
            }
        }
        closedir($dir);
    }
    
    // Проверка заблокированных ip-адресов
    $is_block = false;
    if ($dir = opendir($path_block)) {
        while (false !== ($filename = readdir($dir))) {
            // Выбирается ip + время блокировки этого ip
            if (preg_match('#^(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})_(\d+)$#', $filename, $matches)) {
                if ($matches[2] >= time() - self::blockSeconds) {
                    if ($matches[1] == $ip_address) {
                        $is_block = true;
                        $time_block = $matches[2] - (time() - self::blockSeconds) + 1;
                    }
                } else {
                    unlink($path_block . $filename);
                }
            }
        }
        closedir($dir);
    }
    
    // ip-адрес заблокирован
    if ($is_block) {
        header('HTTP/1.0 502 Bad Gateway');
        echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
        echo '<html xmlns="http://www.w3.org/1999/xhtml">';
        echo '<head>';
        echo '<title>502 Bad Gateway</title>';
        echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />';
        echo '</head>';
        echo '<body>';
        echo '<h1 style="text-align:center">502 Bad Gateway</h1>';
        echo '<p style="background:#ccc;border:solid 1px #aaa;margin:30px au-to;padding:20px;text-align:center;width:700px">';
        echo 'К сожалению, Вы временно заблокированы, из-за частого запроса страниц сайта.<br />';
        echo 'Вам придется подождать. Через ' . $time_block . ' секунд(ы) Вы будете автоматически разблокированы.';
        echo '</p>';
        echo '</body>';
        echo '</html>';
        exit;
    }

    PHP-скрипт для защиты от DDOS, парсинга и ботов
    https://habr.com/ru/post/659811/

    Запостил: ISO, 08 Апреля 2022

    Комментарии (19) RSS

    • Ура, теперь не нужен никакой «iptables»!

      А таже «ip6tables», «nftables», «ufw» и прочие «firewalld».
      Ответить
      • Извините пожалуйста, но последние два в Вашем списке никогда и не были нужны...
        Ответить
    • Спасибо, установил скрипт себе на сайт
      Теперь хакеры его не положат?

      Если без шуток, то можно написать плагин к sshguard (или fail2ban)+ ipset (ну или что там в nft заместо ево)
      Ответить
    • ЛУР В КОММЕНТАХ!!!!!
      Ответить
    • >fail2ban реализуется средствами сервера, а доступ как правило есть не всегда

      Если тратить по два евро в месяц на поддержку VPS для вашего бизнеса нерентабельно, то я рекомендую завести страницу Вконтакте. Она намного дешевле, и неплохо защищена от ддос атак
      Ответить
      • > тратить по два евро в месяц
        Половину зарплаты буржуям отдавать?!
        Без зелёного через год.
        Ответить
        • >через год.
          через год ты будешь хоститься в Облако@Mail.ru, по паспорту и ИНН, а там оплату в рублях принимают
          Ответить
          • Надеюсь, что к тому времени я уже буду или пеплом, или гулем. У меня тут как раз неподалёку и военный аэродром, и ядерный объект имеются.
            Ответить
            • Мариновка?
              да-/

              Выживет в итоге один только Борманд и еще 1024-
              До сибири не долетит
              ну, может оно и к лучшему
              Ответить
          • Не в рублях, а газом
            Ответить
      • Это где хостинг за 2€/мес?
        Ответить
    • Скрипт не поддерживает ipv6!
      Ответить
    • >Да, верно, для каждого ip создаётся файлик, и сам удаляется.

      То есть удачной ддос атакой можно быстро закончить все inodes на шареде? отличный скрипт

      А почему создается файлик я тоже понимаю: не на всех хостингах есть mysql и memcached
      Ответить
      • > удачной ддос атакой
        Я самую мякотку-то пропустил!
        /**
        * Метод получения текущего ip-адреса из переменных сервера.
        */
        private static function _getIp() {
        
            // ip-адрес по умолчанию
            $ip_address = '127.0.0.1';
        
            // Массив возможных ip-адресов
            $addrs = array();
        
            // Сбор данных возможных ip-адресов
            if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
                // Проверяется массив ip-клиента установленных прозрачными прокси-серверами
                foreach (array_reverse(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) as $value) {
                    $value = trim($value);
                    // Собирается ip-клиента
                    if (preg_match('#^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$#', $value)) {
                        $addrs[] = $value;
                    }
                }
            }
            // Собирается ip-клиента
            if (isset($_SERVER['HTTP_CLIENT_IP'])) {
                $addrs[] = $_SERVER['HTTP_CLIENT_IP'];
            }
            // Собирается ip-клиента
            if (isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
                $addrs[] = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
            }
            // Собирается ip-клиента
            if (isset($_SERVER['HTTP_PROXY_USER'])) {
                $addrs[] = $_SERVER['HTTP_PROXY_USER'];
            }
            // Собирается ip-клиента
            if (isset($_SERVER['REMOTE_ADDR'])) {
                $addrs[] = $_SERVER['REMOTE_ADDR'];
            }
        
            // Фильтрация возможных ip-адресов, для выявление нужного
            foreach ($addrs as $value) {
                // Выбирается ip-клиента
                if (preg_match('#^(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})$#', $value, $matches)) {
                    $value = $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4];
                    if ('...' != $value) {
                        $ip_address = $value;
                        break;
                    }
                }
            }
        
            // Возврат полученного ip-адреса
            return $ip_address;
        }
        Ответить
        • Для не желающих вникать в дерьмо: посылаем серверу заголовок «CLIENT-IP: 127.0.0.1», скрипт банит 127.0.0.1.
          Ответить
          • посылаем с одного компа скрипт, который перебирает все IP адреса, засираем диск, и ломаем одновременно и перформанс и коннективити
            Ответить
            • Так вот что такое "DDoS с одного компьютера". А мы смеялись.
              Ответить
    • СТРАЙКЕР СОСЁТ МОЙ ХУЙ СТРАЙКЕР СОСЁТ МОЙ ХУЙ СТРАЙКЕР СОСЁТ МОЙ ХУЙ СТРАЙКЕР СОСЁТ МОЙ ХУЙ СТРАЙКЕР СОСЁТ МОЙ ХУЙ
      СТРАЙКЕР СОСЁТ МОЙ ХУЙ
      СТРАЙКЕР СОСЁТ МОЙ ХУЙ
      СТРАЙКЕР СОСЁТ МОЙ ХУЙ
      Ответить

    Добавить комментарий