Уважаемые Программисты выручите, пожалуйста. Нужно подправить немного php скрипт. Нудно чтобы ip адреса для блокировки записывать не в сам скрипт, а именно в файл black_list.dat или black_list.txt, чтобы там был формат такой 99.99.99.99 */ и тут после слеша комментарий. Потом добавить еще один файл для записи какие ip адреса из забаненных, из этого файла black_list.dat, которые уже в этом файле записаны, сколько раз обращались к сайту. По возможности, если такое возможно, чтобы удалял дубли ip адресов. Весь интернет перерыл, два подходящих нашел, но нехватает этого функционала. Помогите, пожалуйста, сам в php вообще не понимаю, один негодяй мне сайт топит ботами, буду отлавливать и банить. Спойлер: php скрипт PHP: <?php $file = "black_list.txt"; $cr = array_map("trim", file("black_list.txt")); if(in_array($_SERVER['REMOTE_ADDR'],$cr) ){ echo "Blocked!"; exit(); } ?> PHP: <?php /* http://wm-help.net/ */ /* Сообщение при банне ip */ define("bann_message", "Для вашего IP: %ip% доступ к сайту закрыт."); /* Предупреждение о возможности банна по ip */ define("wrong_message", "Вы предупреждены администратором данного сайта о возможной блокировке вашего IP: %ip% в случае дальнейшего нарушения правил."); /* массив с ip и типом блокировки. в ключе массива IP, в значении тип блокировки */ $bann_array = array( "195.66.203.247"=>"bann", // реальный плохой IP "220.94.220.60"=>"bann", // реальный плохой IP //"127.0.0.1"=>"wrong" // Test ); /* Функция для почти 100% определения IP адреса посетителя. */ /* Перебирает все возможные переменные с IP. */ function _ip() { if(isset($HTTP_SERVER_VARS)) { if(isset($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])) { $realip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]; }elseif(isset($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])) { $realip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"]; }else{ $realip = $HTTP_SERVER_VARS["REMOTE_ADDR"]; } }else{ if(getenv( 'HTTP_X_FORWARDED_FOR' ) ) { $realip = getenv( 'HTTP_X_FORWARDED_FOR' ); }elseif ( getenv( 'HTTP_CLIENT_IP' ) ) { $realip = getenv( 'HTTP_CLIENT_IP' ); }else { $realip = getenv( 'REMOTE_ADDR' ); } } return $realip; } /* Определяет, что делать с владельцем того или иного ip адреса */ function bann_on_not_to_bann() { global $bann_array; // получаем массив с ip адресами $user_ip = _ip(); // получаем ip /* разбираем массив на ключ и значение */ foreach($bann_array as $ip=>$type) { if ($ip == $user_ip) // проверяем { switch($type) // если ip совпал то смотрим что делать { case "wrong": // предупреждение { echo str_replace("%ip%", $user_ip, wrong_message); // выводим предупреждение break; // выход из switch } case "bann": // блокировка { die(str_replace("%ip%", $user_ip, bann_message)); // Сообщение о том, что доступ закрыт + завершение работы php // break не требуется т.к. дальше уже ничего не выполняется } } } } } /* проверяем владельца ip и блокируемпредупреждаем если это спамер */ bann_on_not_to_bann(); ?>
Это не подходит, планирую ZennoPoster, собирать все паблик прокси вот например https://hidemy.name/ru/proxy-list/ делать через прокси гет запрос к серверу получу такой ответ PHP: HTTP/1.1 200 OK Server: nginx/1.20.1 Date: Wed, 25 Aug 2021 12:43:21 GMT Transfer-Encoding: chunked Connection: keep-alive X-Powered-By: PHP/7.1.33 Strict-Transport-Security: max-age=31536000; Content-Type: text/html; charset=UTF-8 Content-Length: 15 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 адреса. Буду на опережение работать.
Тогда делайте авторизацию. Разбирать тысячи строк для каждого запроса, всё равно, что в ногу себе выстрелить.
Не совсем понятно что вы хотите сделать со скриптами из первого сообщения. Если нужно записать что-то в текстовый файл, то предоставьте образец записываемого и откуда вы это планируете получить. Из формы ли или текстового же файла.
Будет файл black_list.txt с этими ip строками Код (Text): 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 После строк стоит дата проверки ip адреса. Обще доступные прокси долго не работают, дата нужна, для того что бы я через сутки, опираясь на эту дату удалил ip адреса, а так может файл распухнуть до больших размеров. На сервере у меня такой скрипт, я делаю get запрос, через прокси, получаю ip адрес прокси и дату, регулярками забираю это все и записываю в файл black_list.txt Код (Text): <?php $client = @$_SERVER['HTTP_CLIENT_IP']; $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; $remote = @$_SERVER['REMOTE_ADDR']; if(filter_var($client, FILTER_VALIDATE_IP)) $ip = $client; elseif(filter_var($forward, FILTER_VALIDATE_IP)) $ip = $forward; else $ip = $remote; echo $ip; ?> Без даты, в первом посте, скрипты работают, но мне нужно еще дату туда вписать, чтобы я мог на эту дату опираться и через сутки удалить ip адреса. Не знаю как еще объяснить --- Добавлено --- Забыл еще один файл добавить, назовём его black_list2.txt если ip адрес в бане, а к сайту обращаются с ip адреса забаненного, то в этот файл пишется ip адрес black_list2.txt и сколько раз обращались, так я смогу понять откуда негодяй берет прокси, и буду только этот источник банить
PHP: <?php $file = file('black_list.txt', FILE_IGNORE_NEW_LINES); $cr = array(); foreach($file as $value) { list($ip, $date) = explode('|', $value); $cr[] = $ip; } if(in_array($_SERVER['REMOTE_ADDR'],$cr) ){ echo "Blocked!"; exit(); } ?>
Отлично, работает, спасибо брат! Даже не удобно, не знаю как сказать, прикрутить файл еще один, чтобы и еще из забаненных адресов, обращались к сайту, в этот файл запись? Если это технически не возможно, и на этом БОЛЬШЕЕ СПАСИБО!
Вот смотрите, PHP: <?php $file = file('black_list1.txt', FILE_IGNORE_NEW_LINES); $cr = array(); foreach($file as $value) { list($ip, $date) = explode('|', $value); $cr[] = $ip; } if(in_array($_SERVER['REMOTE_ADDR'],$cr) ){ echo "Blocked!"; exit(); } ?> black_list1.txt этот лист тут прописаны ip адреса которые забанил, например там сейчас конкретно записан Код (Text): 53.68.198.95|25 Aug 2021 12:43:21 Это мой адрес прокси с которого я захожу на сайт (например я нарушитель) и вот я второй раз захожу с этим ip адресом Код (Text): 53.68.198.95 , а он уже забанен, значит делается запись во второй лист black_list2.txt , вот этот забаненный ip адрес заходил на сайт три раза Код (Text): 53.68.198.95|3 после вертикальной черты, количество раз заходил на сайт забененный.
Вот в этой части скрипта PHP: $cr = array(); foreach($file as $value) { list($ip, $date) = explode('|', $value); $cr[] = $ip; } показано, как разобрать элемент массива $file на составляющие с помощью list() и explode() и поместить в новый массив $cr
Не нужен другой список. PHP: $cr = array(); foreach($file as $value) { list($ip, $date) = explode('|', $value); $cr[$ip] = $date; } print_r($cr); А вместо Код (Text): if(in_array($_SERVER['REMOTE_ADDR'],$cr) ){ echo "Blocked!"; exit(); } используйте PHP: if(isset($cr[$_SERVER['REMOTE_ADDR']]) ) { echo "Blocked!"; exit(); }
Как тогда узнать, с забаненных адресов заходили, я не узнаю и придется банить все прокси бесплатные, а так я смогу вычислить, с какого сайта берутся прокси, и буду только с него банить
Вот сделал как написано, не работает, и не банит сейчас PHP: <?php $file = file('black_list.txt', FILE_IGNORE_NEW_LINES); $cr = array(); foreach($file as $value) { list($ip, $date) = explode('|', $value); $cr[] = $ip; } if(isset($cr[$_SERVER['REMOTE_ADDR']]) ) { echo "Blocked!"; exit(); } ?>
Потому, что у вас $cr[] = $ip; а не $cr[$ip] = $date; Теперь скрипт проверяет существование ключа [$_SERVER['REMOTE_ADDR'] в массиве $cr if(isset($cr[$_SERVER['REMOTE_ADDR']]...
Да какой ключ, в прямом смысле слова не пойму, мне чтобы этот код добавить, пришлось два файла сохранить, и тоталом коммандером сравнить, я смотрю код для меня одинаковый, вот я радиотехник, я могу на схему и я ее запомнил, могу ремонтировать аппаратуру не глядя на схему, даже если год пройдет. А тут вы хотите мне сказать как сделать, а я не пойму о чем вы даже --- Добавлено --- Работает, а как узнать теперь? Заходил кто то с этого ip? Код (Text): <?php $file = file('black_list.txt', FILE_IGNORE_NEW_LINES); $cr = array(); foreach($file as $value) { list($ip, $date) = explode('|', $value); $cr[$ip] = $date; } if(isset($cr[$_SERVER['REMOTE_ADDR']]) ) { echo "Blocked!"; exit(); } ?> --- Добавлено --- Второго списка нет, и как мне узнать, вот сейчас себя забанил, и как узнать, я заходил на сайт или нет?
ОК. Начнем с азов с учетом новых вводных. Есть два текстовых файла black_list1.txt и black_list2.txt Где хранятся данные в формате "IP|other" в каждой новой строке. Правильно?
Внимательно изучите нижеследующее и объясните что там происходит. PHP: <?php $file1 = file('black_list1.txt', FILE_IGNORE_NEW_LINES); $file2 = file('black_list2.txt', FILE_IGNORE_NEW_LINES); $cr = array(); foreach($file1 as $value) { list($ip, $date) = explode('|', $value); $cr[$ip]['date'] = $date; } foreach($file2 as $value) { list($ip, $visits) = explode('|', $value); $cr[$ip]['visits'] = $visits; } echo '<pre>'; print_r($cr); ?>
black_list1.txt в этом листе заблокированные ip адреса black_list2.txt в этом листе сколько раз заходил заблокированный ip адрес в формате 53.68.198.95|3 три это три раза заходил --- Добавлено --- сайт поломался и открывается сайт если в низ прокрутить