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

  • Автор темы Автор темы aad781
  • Дата начала Дата начала

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.
 
не понял.
ни смысла этого кода
ни где здесь регулярное выражение, которое ты составил.
ни зачем тут вообще регулярные.
 
Ок, если не понятен мой код, то продемонстрируйте свои соображения на эту тему...
 
)))
Может скорей будет работать так:
for($i=0; $i<count($baze); $i++) {
if($_SERVER['REMOTE_ADDR'] == $baze[$i]) {
echo "banned...";
exit;
}
}
 
Привет.
Попробуй
for($i=0; $i<count($baze); $i++) $base[$i] = trim($base[$i]);

-~{}~ 03.01.05 14:38:

сразу после
$baze = file('ip-ban.dat');
 
vovchik542
ты правильно написал про трим, но, наверное, лучше будет вставить его в код CasterTroy, а не прогонять отдельным циклом?

Ием более, что тут и цикл-то, в общем, не нужен
 
Фанат
ну, верно. Можно
$base[$i] = str_replace('\n', '', $base[$i]);
в код CasterTroy
Кстати, что быстрее??
 
Что быстрее - неважно.
Но trim правильнее

-~{}~ 03.01.05 16:11:

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

Кстати, у тебя в последнем коде ошибка,он вообще работать не будет
 
подумалось.
что быстрее - in_array(file()) или предложенный вариант?
тестировать влом, но склоняюсь к in_array - там не надо с каждой позиции посимвольно проверять...
 
ip2long и сравнивайте числа :) это делает одним тактом процессора :)
ну и с НГ (за одно :))
 
fixxxer
file тоже парсит весь файл посимвольно, чтобы на массив разбить.
не то, чтобы я утверждал, что так быстрее, но пустого разговоря для :-)
 
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 вообще не рабочий по большому счету
 
CasterTroy, vovchik542, Фанат, так будет банить только по уже готовому ip, а надо по маске... Например, если маска 200. то банит все ip начинающиеся с 200.
Все вышепредложенные варианты не будут банить по маске...
 
для тебя составляет проблему отрезать от айпи адреса кусок, равный маске?
 
Фанат, да, в этом есть небольшая проблемочка, просто я не очень сильно задумывался над этим, а просто решил воспользоваться регекспом для сверки ip... Да и особо на ум не приходит каким образом енто сделать... В общем идея неплохая и преблизительно я понимаю как енто сделать... да ладно, просто у меня сегодня мозги не соображают... помогите нетрезвому челу...
 
я бы сделал так, на мой взгляд оптимально:

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
 
Сверху