Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > бан по ip


Автор: Zhenek 8.12.2009, 03:18
Есть код :

Код

<?

$res = mysql_query("SELECT * FROM `ban_ip` ")  or die(mysql_error());
while($ip = mysql_fetch_row($res)) {
    $bip = explode(".",$ip[1]);
    $uip = explode(".",$_SERVER['REMOTE_ADDR']);
 
    for($i=0; $i<4; $i++){
    $bip[$i] = str_replace("x","([0-9]{0,1})",$bip[$i]);
    if(substr($bip[$i],-6)=='{0,1})'){$bip[$i] = substr($bip[$i],0,-6)."{1})" ;}
 
    if(preg_match("/".$bip[$i]."/",$uip[$i])) $Allowed = False;
    }

}

if(!$Allowed ) die();
?>


Подключение к базе вызывается раньше чем этот фаил инклудом.



Он должен блокировать Ип  как просто так так и по маске   127.x.0.1

Но он всегда говорит что ИП в бане( что в нем не так??


Структура базы данных

id  ip  type      time  comment
1   127.0.0.1     0         блабла
2   145.5.0.1     0         блабла

Автор: nerezus 8.12.2009, 03:48
Ну код и жесть.
Его можно записать ровно в 2 строки, причем вторая будет die().

1) Запрос делай на селект НУЖНОГО ip.
2) Зачем стравнивать посегментно? Это неверно, сравнивай целиком.

Автор: MoLeX 8.12.2009, 06:49
как то так
Код


if( mysql_query("SELECT * FROM `ban_ip` WHERE `ip_type` = '".$_SERVER['REMOTE_ADDR']."' ") )
  exit();



Добавлено через 49 секунд
ip2long()
посмотри на эту фун-цию

Автор: Zhenek 8.12.2009, 07:34
Вы видимо не читали что я писал..

Мне нужно заносить в базу не только IP но еще и маски. прмиер :

127.x.0.0

тоесть вместо x  может быть цифры от 0 до 255

Автор: Simpliest 8.12.2009, 08:21
Цитата(Zhenek @  8.12.2009,  06:34 Найти цитируемый пост)
127.x.0.0

маска = 127.%.%.123

ip LIKE маска

Добавлено через 1 минуту и 38 секунд
регуляркой впрочем делается почти так же

Автор: Ипатьев 8.12.2009, 10:45
Маска какая-то ОЧЕНЬ странная

Автор: _zorn_ 8.12.2009, 11:43
Код конечно жесть, но ошибку все таки видно. 
Нет начальной инициализации $Allowed = true;

Автор: Nigel 8.12.2009, 13:26
Можете попробовать такой вариант
Код

SELECT 1
FROM bans
WHERE $yourip REGEXP replace( ip, 'x', '[0-9]{1,3}' ) limit 1

Если есть возвращаемое значение, значит запрещаем доступ.
Можете также использовать поиск по диапазону. Для этого храните айпи адреса в виде чисел ip_from, ip_to. При сохранении в базу x заменяете на числа 0 и 255 соответсвенно.
Запрос будет вида
Код

select 1 from bans where $yourip >=ip_from and $yourip <=ip_to limit 1

Если в базе будет храниться несколько тысяч строк, то лучше использовать второй вариант, так как в этом случае поиск будет идти по ключу.

Автор: nerezus 8.12.2009, 16:01
Цитата

127.x.0.0 
 Это не маска, а результат неверных измышлений.

Автор: Pitlord 8.12.2009, 18:23
Google: http://www.google.ru/#hl=ru&newwindow=1&q=CIDR&lr=&aq=&oq=CIDR&fp=5f96a978f2abe2da

IP — число и про LIKE/регулярки надо забыть.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)