Forum Webscript.Ru
Общие => Базы данных => Тема начата: Ardzhan от 04 Декабря 2002, 19:09:30
-
Передо мной стала такая задача. Есть база данных с IP адресами и шаблонами типа 127.*.*.7 (MySQL).
Как сделать проверку на пхп соответствует ли веденный IP хотя бы одной строке в базе???
Короче надо банить по IP и по маске. Кто-нибудь такое делал???
-
Кроспостинг корается!
-
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\'
-
Нет, этот вариант не очень подходит. Можно ли регуляркой???
-
э...может быть стоит хранить IP в виде битовой маски, и битовыми же операциями проверять соответствие этой маске?
Подробнее не буду, лень думать в такое время.
-
А RLIKE не подходит?
Если таблица большая, возможно, действительно надо разбивать на 4 поля (RLIKE, естественно, уже не понадобится) и индексировать их.
-
Господа, не тупите, пожалуйста...
$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) и пара строчек кода...
-
Господа, не тупите, пожалуйста...
Гы, сдается мне, что человек хочет создавать бан-листы. Т.е. проверять, удовлетворяет ли айпишник хоть чему-нибудь из бд. Что ему, для этого просто жизненно необходимо всю базу к себе вытягивать?
-
Ardzhan
REGEXP смотри в мане mysql
все через него можно сделать на два. :)
-
Maniac,
ThE0ReTiC
есть же в MySql bitwise AND: http://www.mysql.com/doc/en/Bit_functions.html#IDX1315
Неужели нельзя без регекспов обойтись, одними битовыми операциями?
(это я просто спрашиваю)
-
Xander
А может и можно. :)
Я просто через регулярки такую проблему решал и знаю, что это работает.
-
Maniac
Да... Именно это. Если бы наоброт выбрать маску из базы, тогда проще SeLECT... Where ip LIKE \'127.0.0.%\'...
А как проверить, что одна из масок в базе соответствует IP???
-
Xander Не пашут эти биты...
Сделал функцию:
function comparemask($string, $mask){
$mask=str_replace(".", "\\.", $mask);
$mask=str_replace("*", "(.+)", $mask);
if (preg_match ("/$mask/i", $string)) {return 1;} else {return 0;}
}
Ну и что??? Выгружать теперь всю таблицу? :(
-
Ardzhan
если маски будут лишь 127.0.0.* или 127.0.*.* то имхо можно и через функции INET_ATON , INET_NTOA (не знаю быстрее ли они чем REGEXP)
если маски будут типа 127.*.0 то , как тебе уже тут писали - через REGEXP.
-
У меня есть ощущение, что пробежаться с битовыми операциями в PHP-массиве может быть быстрее, чем с регекспами в базе, но я в этом не уверен. А битовые операции MySQL действительно с символами не работают :(
-
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 Что через регулярку, я и сам знаю... А как, если не секрет...
-
например так (у меня так работает):
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\'
-
Я понимаю, что это работает... И знаю как MySQL использовать регулярки я тоже знаю. Но задача-то не выбрать по маске, а...
В базе есть строчки, которые содержат маски.
Надо подсчитать кол-во масок, которым соответствует IP
-
Тогда их надо выбирать из базы и строить regexp\'ы уже из них. Это если ты не хочешь разбивать адрес на 4 поля по байту (хотя я не понимаю, почему).
-
select count(*)
-
AlieN
select count(*)
- так ты посчитаешь все строчки.
А надо...
Надо подсчитать кол-во масок, которым соответствует IP
MY
Тогда их надо выбирать из базы и строить regexp\'ы уже из них. Это если ты не хочешь разбивать адрес на 4 поля по байту (хотя я не понимаю, почему).
Понятно... Значит не тянуть базу не получится :-(
Ну с IP разбить-то можно. Но есть еще одна таблица со списком забаненных URL... типа some*site*.asd*.ru - тут-то не разобьешь!
Спасибо за ответы.