За последние 24 часа нас посетили 20816 программистов и 1130 роботов. Сейчас ищут 350 программистов ...

Php скрипт для блокировки доступа по ip к сайту

Тема в разделе "Сделайте за меня", создана пользователем kinoveb, 25 авг 2021.

  1. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Уважаемые Программисты выручите, пожалуйста. Нужно подправить немного php скрипт.
    Нудно чтобы ip адреса для блокировки записывать не в сам скрипт, а именно в файл black_list.dat
    или black_list.txt, чтобы там был формат такой 99.99.99.99 */ и тут после слеша комментарий.

    Потом добавить еще один файл для записи какие ip адреса из забаненных, из этого файла black_list.dat, которые уже в этом файле записаны, сколько раз обращались к сайту.
    По возможности, если такое возможно, чтобы удалял дубли ip адресов.
    Весь интернет перерыл, два подходящих нашел, но нехватает этого функционала.
    Помогите, пожалуйста, сам в php вообще не понимаю, один негодяй мне сайт топит ботами, буду отлавливать и банить.

    PHP:
    1. <?php
    2. $file = "black_list.txt";
    3. $cr = array_map("trim", file("black_list.txt"));
    4. if(in_array($_SERVER['REMOTE_ADDR'],$cr) ){
    5. echo "Blocked!";
    6. exit();
    7. }
    8. ?>

    PHP:
    1. <?php
    2. /* http://wm-help.net/ */
    3. /* Сообщение при банне ip */
    4. define("bann_message", "Для вашего IP: %ip% доступ к сайту закрыт.");
    5. /* Предупреждение о возможности банна по ip */
    6. define("wrong_message", "Вы предупреждены администратором данного сайта о возможной блокировке вашего IP: %ip% в случае дальнейшего нарушения правил.");
    7. /* массив с ip и типом блокировки. в ключе массива IP, в значении тип блокировки */
    8. $bann_array = array(
    9.                     "195.66.203.247"=>"bann", // реальный плохой IP
    10.                     "220.94.220.60"=>"bann",  // реальный плохой IP
    11.                     //"127.0.0.1"=>"wrong"      // Test
    12.                     );
    13. /* Функция для почти 100% определения IP адреса посетителя. */
    14. /* Перебирает все возможные переменные с IP. */
    15. function _ip()
    16. {
    17.   if(isset($HTTP_SERVER_VARS)) {
    18.     if(isset($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])) {
    19.     $realip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
    20.     }elseif(isset($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])) {
    21.       $realip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
    22.     }else{
    23.       $realip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
    24.     }
    25.   }else{
    26.   if(getenv( 'HTTP_X_FORWARDED_FOR' ) ) {
    27.     $realip = getenv( 'HTTP_X_FORWARDED_FOR' );
    28.   }elseif ( getenv( 'HTTP_CLIENT_IP' ) ) {
    29.     $realip = getenv( 'HTTP_CLIENT_IP' );
    30.   }else {
    31.     $realip = getenv( 'REMOTE_ADDR' );
    32.   }
    33. }
    34. return $realip;
    35. }
    36. /* Определяет, что делать с владельцем того или иного ip адреса */
    37. function bann_on_not_to_bann()
    38. {
    39.     global $bann_array; // получаем массив с ip адресами
    40.     $user_ip = _ip();   // получаем ip
    41. /* разбираем массив на ключ и значение */
    42. foreach($bann_array as $ip=>$type)
    43. {
    44.     if ($ip == $user_ip) // проверяем
    45.     {
    46.         switch($type) // если ip совпал то смотрим что делать
    47.         {
    48.             case "wrong": // предупреждение
    49.             {
    50.                 echo str_replace("%ip%", $user_ip, wrong_message); // выводим предупреждение
    51.                 break; // выход из switch
    52.             }
    53.             case "bann": // блокировка
    54.             {
    55.                 die(str_replace("%ip%", $user_ip, bann_message)); // Сообщение о том, что доступ закрыт + завершение работы php
    56.                 // break не требуется т.к. дальше уже ничего не выполняется
    57.             }
    58.         }
    59.     }
    60. }
    61. }
    62. /* проверяем владельца ip и блокируемпредупреждаем если это спамер */
    63. bann_on_not_to_bann();
    64. ?>
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
  3. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Это не подходит, планирую ZennoPoster, собирать все паблик прокси вот например https://hidemy.name/ru/proxy-list/ делать через прокси гет запрос к серверу получу такой ответ
    PHP:
    1. HTTP/1.1 200 OK
    2. Server: nginx/1.20.1
    3. Date: Wed, 25 Aug 2021 12:43:21 GMT
    4. Transfer-Encoding: chunked
    5. Connection: keep-alive
    6. X-Powered-By: PHP/7.1.33
    7. Strict-Transport-Security: max-age=31536000;
    8. Content-Type: text/html; charset=UTF-8
    9. Content-Length: 15
    10.  
    11. 51.68.198.95
    регуляркой забираю ip и дату и делаю запись в файл
    51.68.195.95|25 Aug 2021 12:43:21
    51.68.194.95|25 Aug 2021 12:43:21
    53.68.198.95|25 Aug 2021 12:43:21
    53.68.198.95|25 Aug 2021 12:43:21
    там может быть тысяч 20 этих ip адресов, паблик прокси долго не работают, через сутки по дате удаляю ip адреса. Буду на опережение работать.
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Тогда делайте авторизацию. Разбирать тысячи строк для каждого запроса, всё равно, что в ногу себе выстрелить.
     
  5. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Зеннопостер по ftp закачает, 10 000 строк за час можно прочекать, может даже меньше
     
  6. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Не совсем понятно что вы хотите сделать со скриптами из первого сообщения.
    Если нужно записать что-то в текстовый файл, то предоставьте образец записываемого и откуда вы это планируете получить. Из формы ли или текстового же файла.
     
  7. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Будет файл black_list.txt с этими ip строками
    Код (Text):
    1. 51.68.195.95|25 Aug 2021 12:43:21
    2. 51.68.194.95|25 Aug 2021 12:43:21
    3. 53.68.198.95|25 Aug 2021 12:43:21
    4. 53.68.198.95|25 Aug 2021 12:43:21
    После строк стоит дата проверки ip адреса. Обще доступные прокси долго не работают, дата нужна, для того что бы я через сутки, опираясь на эту дату удалил ip адреса, а так может файл распухнуть до больших размеров.
    На сервере у меня такой скрипт, я делаю get запрос, через прокси, получаю ip адрес прокси и дату, регулярками забираю это все и записываю в файл black_list.txt
    Код (Text):
    1. <?php
    2. $client  = @$_SERVER['HTTP_CLIENT_IP'];
    3. $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    4. $remote  = @$_SERVER['REMOTE_ADDR'];
    5. if(filter_var($client, FILTER_VALIDATE_IP)) $ip = $client;
    6. elseif(filter_var($forward, FILTER_VALIDATE_IP)) $ip = $forward;
    7. else $ip = $remote;
    8. echo $ip;
    9. ?>
    Без даты, в первом посте, скрипты работают, но мне нужно еще дату туда вписать, чтобы я мог на эту дату опираться и через сутки удалить ip адреса. Не знаю как еще объяснить
    --- Добавлено ---
    Забыл еще один файл добавить, назовём его black_list2.txt если ip адрес в бане, а к сайту обращаются с ip адреса забаненного, то в этот файл пишется ip адрес black_list2.txt и сколько раз обращались, так я смогу понять откуда негодяй берет прокси, и буду только этот источник банить
     
  8. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    PHP:
    1. <?php
    2.  
    3. $file = file('black_list.txt', FILE_IGNORE_NEW_LINES);
    4.  
    5. $cr = array();
    6.  
    7. foreach($file as $value)
    8. {
    9.   list($ip, $date) = explode('|', $value);
    10.   $cr[] = $ip;
    11. }
    12.  
    13. if(in_array($_SERVER['REMOTE_ADDR'],$cr) ){
    14. echo "Blocked!";
    15. exit();
    16. }
    17. ?>
     
    kinoveb нравится это.
  9. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Отлично, работает, спасибо брат! Даже не удобно, не знаю как сказать, прикрутить файл еще один, чтобы и еще из забаненных адресов, обращались к сайту, в этот файл запись?
    Если это технически не возможно, и на этом БОЛЬШЕЕ СПАСИБО!
     
  10. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Попробуйте перефразировать.
     
  11. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Вот смотрите,
    PHP:
    1. <?php
    2. $file = file('black_list1.txt', FILE_IGNORE_NEW_LINES);
    3. $cr = array();
    4. foreach($file as $value)
    5. {
    6.   list($ip, $date) = explode('|', $value);
    7.   $cr[] = $ip;
    8. }
    9. if(in_array($_SERVER['REMOTE_ADDR'],$cr) ){
    10. echo "Blocked!";
    11. exit();
    12. }
    13. ?>
    black_list1.txt этот лист тут прописаны ip адреса которые забанил, например там сейчас конкретно записан
    Код (Text):
    1. 53.68.198.95|25 Aug 2021 12:43:21
    Это мой адрес прокси с которого я захожу на сайт (например я нарушитель) и вот я второй раз захожу с этим ip адресом
    Код (Text):
    1. 53.68.198.95
    , а он уже забанен, значит делается запись во второй лист black_list2.txt , вот этот забаненный ip адрес заходил на сайт три раза
    Код (Text):
    1. 53.68.198.95|3
    после вертикальной черты, количество раз заходил на сайт забененный.
     
  12. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вот в этой части скрипта
    PHP:
    1. $cr = array();
    2. foreach($file as $value)
    3. {
    4.   list($ip, $date) = explode('|', $value);
    5.   $cr[] = $ip;
    6. }
    показано, как разобрать элемент массива $file на составляющие с помощью list() и explode()
    и поместить в новый массив $cr
     
  13. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    А как записать в другой список? Я же вообще ни чего не понимаю в php
     
  14. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Не нужен другой список.
    PHP:
    1. $cr = array();
    2. foreach($file as $value)
    3. {
    4.   list($ip, $date) = explode('|', $value);
    5.   $cr[$ip] = $date;
    6. }
    7. print_r($cr);
    А вместо
    Код (Text):
    1. if(in_array($_SERVER['REMOTE_ADDR'],$cr) ){
    2. echo "Blocked!";
    3. exit();
    4. }
    используйте
    PHP:
    1. if(isset($cr[$_SERVER['REMOTE_ADDR']]) )
    2. {
    3. echo "Blocked!";
    4. exit();
    5. }
     
    kinoveb нравится это.
  15. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Как тогда узнать, с забаненных адресов заходили, я не узнаю и придется банить все прокси бесплатные, а так я смогу вычислить, с какого сайта берутся прокси, и буду только с него банить
     
  16. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Я дополнил предыдущее
     
    kinoveb нравится это.
  17. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Вот сделал как написано, не работает, и не банит сейчас
    PHP:
    1. <?php
    2. $file = file('black_list.txt', FILE_IGNORE_NEW_LINES);
    3. $cr = array();
    4. foreach($file as $value)
    5. {
    6.   list($ip, $date) = explode('|', $value);
    7.   $cr[] = $ip;
    8. }
    9. if(isset($cr[$_SERVER['REMOTE_ADDR']]) )
    10. {
    11. echo "Blocked!";
    12. exit();
    13. }
    14. ?>
     
  18. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Потому, что у вас $cr[] = $ip; а не $cr[$ip] = $date;
    Теперь скрипт проверяет существование ключа [$_SERVER['REMOTE_ADDR'] в массиве $cr

    if(isset($cr[$_SERVER['REMOTE_ADDR']]...
     
  19. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Да какой ключ, в прямом смысле слова не пойму, мне чтобы этот код добавить, пришлось два файла сохранить, и тоталом коммандером сравнить, я смотрю код для меня одинаковый, вот я радиотехник, я могу на схему и я ее запомнил, могу ремонтировать аппаратуру не глядя на схему, даже если год пройдет. А тут вы хотите мне сказать как сделать, а я не пойму о чем вы даже
    --- Добавлено ---
    Работает, а как узнать теперь? Заходил кто то с этого ip?
    Код (Text):
    1. <?php
    2. $file = file('black_list.txt', FILE_IGNORE_NEW_LINES);
    3. $cr = array();
    4. foreach($file as $value)
    5. {
    6.   list($ip, $date) = explode('|', $value);
    7. $cr[$ip] = $date;
    8. }
    9. if(isset($cr[$_SERVER['REMOTE_ADDR']]) )
    10. {
    11. echo "Blocked!";
    12. exit();
    13. }
    14. ?>
    --- Добавлено ---
    Второго списка нет, и как мне узнать, вот сейчас себя забанил, и как узнать, я заходил на сайт или нет?
     
  20. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    ОК. Начнем с азов с учетом новых вводных.
    Есть два текстовых файла
    black_list1.txt и black_list2.txt
    Где хранятся данные в формате "IP|other" в каждой новой строке.
    Правильно?
     
  21. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Да, только второго нет, я его не вижу, смотрю и не вижу.
    Да, продолжаем
     
  22. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Внимательно изучите нижеследующее и объясните что там происходит.
    PHP:
    1. <?php
    2.  
    3. $file1 = file('black_list1.txt', FILE_IGNORE_NEW_LINES);
    4. $file2 = file('black_list2.txt', FILE_IGNORE_NEW_LINES);
    5.  
    6. $cr = array();
    7.  
    8. foreach($file1 as $value)
    9. {
    10.   list($ip, $date) = explode('|', $value);
    11.   $cr[$ip]['date'] = $date;
    12. }
    13.  
    14. foreach($file2 as $value)
    15. {
    16.   list($ip, $visits) = explode('|', $value);
    17.   $cr[$ip]['visits'] = $visits;
    18. }
    19.  
    20. echo '<pre>';
    21. print_r($cr);
    22.  
    23. ?>
     
    kinoveb нравится это.
  23. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    black_list1.txt в этом листе заблокированные ip адреса
    black_list2.txt в этом листе сколько раз заходил заблокированный ip адрес в формате 53.68.198.95|3 три это три раза заходил
    --- Добавлено ---
    сайт поломался
    upload_2021-8-25_18-41-18.png
    и открывается сайт если в низ прокрутить
     

    Вложения:

  24. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Поместите последний код в отдельный файл.
    Например test.php
     
  25. kinoveb

    kinoveb Новичок

    С нами с:
    25 авг 2021
    Сообщения:
    18
    Симпатии:
    0
    Сделал в файл и так подключил <?php include "test.php";?> тоже самое, и сайт поплыл