[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Бан по IP средствами PHP
zloyrediska
Вечер добрый, только начал изучать пхп, хотел бы узнать почему не работает следующий код, который призван банить по IP из списка:

$ip_list = file("ban.txt");
$visitor_ip = $_SERVER['REMOTE_ADDR'];
if(in_array($visitor_ip, $ip_list))
{
die("You are banned from this site!");
}

ban.txt - соответвтенно список ip c переносом строки.

Заранее спасибо всем кто ответит.



Спустя 3 минуты, 52 секунды (20.11.2010 - 19:50) kovaldm написал(а):
Может сначала нужно обработать массив функцией rtrim()?

Спустя 11 секунд (20.11.2010 - 19:50) Lenarfate написал(а):
вообще, по ip банить не тру. у многих динамический ip(например, у меня), либо можно пользовать прокси

Спустя 1 минута, 55 секунд (20.11.2010 - 19:52) zloyrediska написал(а):
kovaldm
А как это сделать?

Lenarfate
Возможно что и не тру, но все же необхоимость именно в такой ф-ции возникла. =/

Спустя 12 секунд (20.11.2010 - 19:52) DySprozin написал(а):
потому что к каждому ip (элементу массива $ip_list) добавляется либо "\r\n", либо просто "\n"
нужно прежде перебрать все элементы массива (foreach) и у каждого выполнить операцию:
$ip_list[$i]=str_replace("\r","",str_replace("\n","",$ip_list[$i]));

Спустя 2 минуты, 23 секунды (20.11.2010 - 19:55) kovaldm написал(а):
<?php
$ip_list = file("ban.txt");
$visitor_ip = $_SERVER['REMOTE_ADDR'];
$visitor_ip = array_map(rtrim(), $visitor_array);
if(in_array($visitor_ip, $ip_list))
{
die("You are banned from this site!");
}

Спустя 1 минута, 27 секунд (20.11.2010 - 19:56) zloyrediska написал(а):
DySprozin
Это уже интересно, а не ударит ли это по нагрузке а сервер? (порядка 3000 обращиний в секунду) ?

kovaldm
проверил, не помогло =/

Спустя 2 минуты, 21 секунда (20.11.2010 - 19:59) zloyrediska написал(а):
...

Спустя 44 секунды (20.11.2010 - 19:59) kovaldm написал(а):
Блин, как обычно, невнимательность:
<?php
$ip_list = file("ban.txt");
$visitor_ip = $_SERVER['REMOTE_ADDR'];
$ip_list = array_map(rtrim(), $ip_list);
if(in_array($visitor_ip, $ip_list))
{
die("You are banned from this site!");
}

Отвлекся немножко... :rolleyes:

Спустя 32 секунды (20.11.2010 - 20:00) DySprozin написал(а):
;;Это уже интересно, а не ударит ли это по нагрузке а сервер? (порядка 3000 обращиний в секунду) ?
не думаю (;

ну, как вариант можно так:

$ip_list = file("ban.txt");
$visitor_ip = $_SERVER['REMOTE_ADDR'];
if(in_array($visitor_ip."\r\n", $ip_list) || in_array($visitor_ip."\n", $ip_list) )
{
die("You are banned from this site!");
}

Спустя 1 минута, 53 секунды (20.11.2010 - 20:02) kovaldm написал(а):
DySprozin
Это тоже самое, только мой вариант побыстрее будет.

Спустя 1 минута, 7 секунд (20.11.2010 - 20:03) zloyrediska написал(а):
kovaldm
Не работает опять =/, с вариантом DySprozin - все ок

Спустя 1 минута, 52 секунды (20.11.2010 - 20:05) DySprozin написал(а):
хм.. не знал про array_map, спс (;

Спустя 49 секунд (20.11.2010 - 20:06) DySprozin написал(а):
zloyrediska
а вот так?
<?php
$ip_list = file("ban.txt");
$visitor_ip = $_SERVER['REMOTE_ADDR'];
$ip_list = array_map("rtrim", $ip_list);
if(in_array($visitor_ip, $ip_list))
{
die("You are banned from this site!");
}
?>

Спустя 57 секунд (20.11.2010 - 20:07) LRCenter написал(а):
zloyrediska
Лучше банить по комплексу параметров, вот тут это обсуждали http://phpforum.ru/index.php?showtopic=33979&hl=

Спустя 6 секунд (20.11.2010 - 20:07) kovaldm написал(а):
Как это? :blink: У меня работает. Попробуй так:
<?php
$ip_list = file("ban.txt");
$visitor_ip = $_SERVER['REMOTE_ADDR'];
$ip_list = array_map(rtrim, $ip_list);
if(in_array($visitor_ip, $ip_list))
{
die("You are banned from this site!");
}

Спустя 2 минуты, 3 секунды (20.11.2010 - 20:09) zloyrediska написал(а):
DySprozin
Алелуя! ))))) работает )))

kovaldm
Уже работает )))

Еще такой вопрос возник, а как бы покрасивее поступить с баном по маске 192.168.* например ?

Спустя 1 минута, 9 секунд (20.11.2010 - 20:10) kovaldm написал(а):
Через strpos() или регулярку.

Спустя 51 минута, 53 секунды (20.11.2010 - 21:02) ak167 написал(а):
<? 
function
getIP() {
if(isset($_SERVER['HTTP_X_REAL_IP'])) return $_SERVER['HTTP_X_REAL_IP'];
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR'];

return $_SERVER['REMOTE_ADDR'];
}
$block = array('192.168.0.1', '192.168.0.2', '192.168.0.3');
if (in_array(getIP(), $block)) die('IP Blocked');
?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.