Бан ip-адресов

aad781

Guest
Бан ip-адресов

Вот, составил регулярное выражение для бана по маске ip, но при переборе списка ip из файла не работает, пишет мол типа ваш адрес забанен даже если маска совсем другая. Пытался даже ставить несколько разных масок... не помогает
Вот сам регексп:
PHP:
$baze = file('ip-ban.dat');
for($i=0;$i<count($baze);$i++):
$ip = $baze[$i];
endfor;
if(preg_match("!".preg_quote($ip)."!",$_SERVER['REMOTE_ADDR'])):
echo "you ip banned";
else:
echo "ok";
endif;
Работает только если явно указывать значение переменной $ip.
 

Фанат

oncle terrible
Команда форума
не понял.
ни смысла этого кода
ни где здесь регулярное выражение, которое ты составил.
ни зачем тут вообще регулярные.
 

aad781

Guest
Ок, если не понятен мой код, то продемонстрируйте свои соображения на эту тему...
 

CasterTroy

Guest
)))
Может скорей будет работать так:
for($i=0; $i<count($baze); $i++) {
if($_SERVER['REMOTE_ADDR'] == $baze[$i]) {
echo "banned...";
exit;
}
}
 

vovchik542

Новичок
Привет.
Попробуй
for($i=0; $i<count($baze); $i++) $base[$i] = trim($base[$i]);

-~{}~ 03.01.05 14:38:

сразу после
$baze = file('ip-ban.dat');
 

Фанат

oncle terrible
Команда форума
vovchik542
ты правильно написал про трим, но, наверное, лучше будет вставить его в код CasterTroy, а не прогонять отдельным циклом?

Ием более, что тут и цикл-то, в общем, не нужен
 

vovchik542

Новичок
Фанат
ну, верно. Можно
$base[$i] = str_replace('\n', '', $base[$i]);
в код CasterTroy
Кстати, что быстрее??
 

Фанат

oncle terrible
Команда форума
Что быстрее - неважно.
Но trim правильнее

-~{}~ 03.01.05 16:11:

по-хорошему же, этот поиск делается одной строчкой
if(strstr(file_get_contents('ip_ban.dat'),"\n".$_SERVER['REMOTE_ADDR'])) echo "banned";

Кстати, у тебя в последнем коде ошибка,он вообще работать не будет
 

fixxxer

К.О.
Партнер клуба
подумалось.
что быстрее - in_array(file()) или предложенный вариант?
тестировать влом, но склоняюсь к in_array - там не надо с каждой позиции посимвольно проверять...
 

Profic

just Profic (PHP5 BetaTeam)
ip2long и сравнивайте числа :) это делает одним тактом процессора :)
ну и с НГ (за одно :))
 

Фанат

oncle terrible
Команда форума
fixxxer
file тоже парсит весь файл посимвольно, чтобы на массив разбить.
не то, чтобы я утверждал, что так быстрее, но пустого разговоря для :)
 

si

Administrator
if(strstr(file_get_contents('ip_ban.dat'),"\n".$_SERVER['REMOTE_ADDR'])) echo "banned";
он вернет неверный результат например для
$str = "1.2.3.4\n1.2.3.15";
и ip 1.2.3.1

если надо быстро лучше использовать что типа cdb

-~{}~ 03.01.05 16:07:

код с file_get_contents вообще не рабочий по большому счету
 

aad781

Guest
CasterTroy, vovchik542, Фанат, так будет банить только по уже готовому ip, а надо по маске... Например, если маска 200. то банит все ip начинающиеся с 200.
Все вышепредложенные варианты не будут банить по маске...
 

Фанат

oncle terrible
Команда форума
для тебя составляет проблему отрезать от айпи адреса кусок, равный маске?
 

aad781

Guest
Фанат, да, в этом есть небольшая проблемочка, просто я не очень сильно задумывался над этим, а просто решил воспользоваться регекспом для сверки ip... Да и особо на ум не приходит каким образом енто сделать... В общем идея неплохая и преблизительно я понимаю как енто сделать... да ладно, просто у меня сегодня мозги не соображают... помогите нетрезвому челу...
 

nick4

Guest
я бы сделал так, на мой взгляд оптимально:

1. Добавляешь вначале и конце текущего IP пробел, получается что-то вроде " 127.0.0.1 "
2. Проходишься по циклу file с IP (и подсетками) -> foreach'ем
3. В цикле добавляешь к каждой строке вначале также пробел, например " 127.0"
4. Функцией strstr ищешь вхождение строки подсети в текущем IP (из п.1): strstr(" 127.0.0.1 ", " 127.0"); если вернет true - значит banned :)

пробел необходим чтобы функция strstr искала вхождение с начала строки, иначе она может в IP 127.0.0.1 найти например сеть 27.0.0.1
 
Сверху