Forum Webscript.Ru

Общие => Базы данных => Тема начата: Ardzhan от 04 Декабря 2002, 19:09:30

Название: Использование масок
Отправлено: Ardzhan от 04 Декабря 2002, 19:09:30
Передо мной стала такая задача. Есть база данных с IP адресами и шаблонами типа 127.*.*.7 (MySQL).
Как сделать проверку на пхп соответствует ли веденный IP хотя бы одной строке в базе???
Короче надо банить по IP и по маске. Кто-нибудь такое делал???
Название: Использование масок
Отправлено: Tronyx от 04 Декабря 2002, 19:38:13
Кроспостинг корается!
Название: Использование масок
Отправлено: Stas от 04 Декабря 2002, 21:03:27
ne proboval sohraniat\' v BD ip razbityi v 4 otdel\'nyh field:
===
field1 field2 field3 field4
127      0         0       7

a potom delat\' sql query tipa
WHERE field1=\'127\' and field4=\'7\'
Название: Использование масок
Отправлено: Ardzhan от 04 Декабря 2002, 23:18:01
Нет, этот вариант не очень подходит. Можно ли регуляркой???
Название: Использование масок
Отправлено: Xander от 05 Декабря 2002, 01:34:44
э...может быть стоит хранить IP в виде битовой маски, и битовыми же операциями проверять соответствие этой маске?

Подробнее не буду, лень думать в такое время.
Название: Использование масок
Отправлено: YA от 05 Декабря 2002, 09:43:22
А RLIKE не подходит?
Если таблица большая, возможно, действительно надо разбивать на 4 поля (RLIKE, естественно, уже не понадобится) и индексировать их.
Название: Использование масок
Отправлено: Xander от 05 Декабря 2002, 11:58:47
Господа, не тупите, пожалуйста...


$ip="\\\\\\xC0\\\\\\xA8\\\\\\x00\\\\\\x05";
$mask="\\\\\\xC0\\\\\\xA8\\\\\\x00\\\\\\xFF";
if (($ip & ~$mask)=="\\\\\\x00\\\\\\x00\\\\\\x00\\\\\\x00") {
echo "IP matches mask";
} else {
echo "IP doesnt matches mask";
}
?>

То же самое можно сделать на любом языке, в котором есть бмнарные операторы. И заверяю вас, это будет ГОРАЗДО проще и быстрее, чем хранение IP в четырех полях, RLIKE, или встроенные регекспы языка. Всего-то VARCHAR(4) и пара строчек кода...
Название: Использование масок
Отправлено: Maniac от 05 Декабря 2002, 13:43:01
Цитировать
Господа, не тупите, пожалуйста...

Гы, сдается мне, что человек хочет создавать бан-листы. Т.е. проверять, удовлетворяет ли айпишник хоть чему-нибудь из бд. Что ему, для этого просто жизненно необходимо всю базу к себе вытягивать?
Название: Использование масок
Отправлено: ThE0ReTiC от 05 Декабря 2002, 13:51:47
Ardzhan
REGEXP смотри в мане mysql
все через него можно сделать на два. :)
Название: Использование масок
Отправлено: Xander от 05 Декабря 2002, 13:57:57
Maniac,
ThE0ReTiC

есть же в MySql bitwise AND: http://www.mysql.com/doc/en/Bit_functions.html#IDX1315

Неужели нельзя без регекспов обойтись, одними битовыми операциями?
(это я просто спрашиваю)
Название: Использование масок
Отправлено: ThE0ReTiC от 05 Декабря 2002, 14:38:54
Xander
А может и можно. :)
Я просто через регулярки такую проблему решал и знаю, что это работает.
Название: Использование масок
Отправлено: Ardzhan от 05 Декабря 2002, 15:21:55
Maniac
Да... Именно это. Если бы наоброт выбрать маску из базы, тогда проще SeLECT... Where ip LIKE \'127.0.0.%\'...
А как проверить, что одна из масок в базе соответствует IP???
Название: Использование масок
Отправлено: Ardzhan от 09 Декабря 2002, 23:24:56
Xander Не пашут эти биты...
Сделал функцию:


function comparemask($string, $mask){
$mask=str_replace(".", "\\.", $mask);
$mask=str_replace("*", "(.+)", $mask);
if (preg_match ("/$mask/i", $string)) {return 1;} else {return 0;}
}


Ну и что??? Выгружать теперь всю таблицу?  :(
Название: Использование масок
Отправлено: Макс от 09 Декабря 2002, 23:57:53
Ardzhan
если маски будут лишь 127.0.0.* или 127.0.*.* то имхо можно и через функции INET_ATON , INET_NTOA (не знаю быстрее ли они чем REGEXP)
если маски будут типа 127.*.0 то , как тебе уже тут писали - через REGEXP.
Название: Использование масок
Отправлено: Xander от 10 Декабря 2002, 01:14:43
У меня есть ощущение, что пробежаться с битовыми операциями в PHP-массиве может быть быстрее, чем с регекспами в базе, но я в этом не уверен. А битовые операции MySQL действительно с символами не работают :(
Название: Использование масок
Отправлено: Ardzhan от 10 Декабря 2002, 13:36:34
Xander
Цитировать
А битовые операции MySQL действительно с символами не работают

У меня почему то не сработало и это:
Цитировать
$ip="127.0.0.1";
$mask="127.*.0.1";
$ip="\\xC0\\xA8\\x00\\x05";
$mask="\\xC0\\xA8\\x00\\xFF";
if (($ip & ~$mask)=="\\x00\\x00\\x00\\x00") {
    echo "IP matches mask";
} else {
    echo "IP doesnt matches mask";
}
?>

Цитировать
У меня есть ощущение, что пробежаться с битовыми операциями в PHP-массиве может быть быстрее, чем с регекспами в базе, но я в этом не уверен.

Пробежаться может-то и быстрее, но представь, что прийдется загрузить сначала в ПХП весь результат запроса. По-моему будет быстрее внутри сервера MySQL все это выполнить...
2 MAKC
Цитировать
как тебе уже тут писали - через REGEXP

:D Что через регулярку, я и сам знаю... А как, если не секрет...
Название: Использование масок
Отправлено: ThE0ReTiC от 10 Декабря 2002, 13:45:34
например так (у меня так работает):

Select SUM(bytes) FROM traf_ext WHERE (to_port=\'80\' or to_port=\'443\' or to_port=\'8080\') and from_ip REGEXP "^10\\.0\\.0" and (TO_DAYS(now())-TO_DAYS(dat)) <= \'0\'
Название: Использование масок
Отправлено: Ardzhan от 10 Декабря 2002, 15:00:14
Я понимаю, что это работает... И знаю как MySQL использовать регулярки я тоже знаю. Но задача-то не выбрать по маске, а...
В базе есть строчки, которые содержат маски.
Надо подсчитать кол-во масок, которым соответствует IP
Название: Использование масок
Отправлено: YA от 10 Декабря 2002, 15:17:54
Тогда их надо выбирать из базы и строить  regexp\'ы уже из них. Это если ты не хочешь разбивать адрес на 4 поля по байту (хотя я не понимаю, почему).
Название: Использование масок
Отправлено: AlieN от 10 Декабря 2002, 15:18:31
select count(*)
Название: Использование масок
Отправлено: Ardzhan от 10 Декабря 2002, 15:27:30
AlieN
Цитировать
select count(*)
- так ты посчитаешь все строчки.
А надо...
Цитировать
Надо подсчитать кол-во масок, которым соответствует IP

MY
Цитировать
Тогда их надо выбирать из базы и строить regexp\'ы уже из них. Это если ты не хочешь разбивать адрес на 4 поля по байту (хотя я не понимаю, почему).

Понятно... Значит не тянуть базу не получится :-(
Ну  с IP разбить-то можно. Но есть еще одна таблица со списком забаненных URL... типа some*site*.asd*.ru - тут-то не разобьешь!
Спасибо за ответы.