Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Организация "фильтра IP"

4.9K
29 июня 2009 года
Valar
81 / / 18.03.2008
По-простому, бан-листа.

Есть таблица в MySQL с двумя полями:
id_filter // integer
filter_ip // varchar, 35

Во второму поле хранится ip.
Схема работы проста, в начале скрипта выполняется запрос

 
Код:
SELECT COUNT(*) FROM `ipfilter` WHERE `filter_ip` LIKE '$ip_address'


Хочу изменить систему так, чтобы вместо значения конкретного ip, можно было ставить маски. Например, 127.0.0.* или 127.*. Как запрос для проверки построить в этом случае?
244
29 июня 2009 года
UAS
2.0K / / 19.07.2006
Прочитать в мане по SQL как исопльзовать регулярные выражения. И скармливать запросу нужное регулярное выражение, составленное от подаваемой маски.

А ещё проще - использовать ip2long и long2ip функции php. И в коде просто вычислять крайние long-значения для подаваемой маски. Т.е. для 127.0.0.* берем ip2long("127.0.0.0") и ip2long("127.0.0.255"). И далее в запросе идет обычная проверка на IP: сравнивается он и полученные выше (в прошлом предложении) диапазоны.
366
30 июня 2009 года
int
668 / / 30.03.2005
А like чем же не устроил? Меняешь * на % и всё.

Вот интересно, зачем ip-адресу 35 символов? даже в 100.100.100.100/255.255.255.255 всего 31 символ
304
30 июня 2009 года
Fenyx
707 / / 26.01.2005
Цитата: int
А like чем же не устроил? Меняешь * на % и всё.

Вот интересно, зачем ip-адресу 35 символов? даже в 100.100.100.100/255.255.255.255 всего 31 символ


Работа с символами всегда больее напряжная процедура цем с числами + для LIKE не работают индескы. Вариант UAS напорядок быстрее, а тем более, если записей в таблице будет много

366
30 июня 2009 года
int
668 / / 30.03.2005
А как в варианте с числом сделать 72.34.*.12?
304
30 июня 2009 года
Fenyx
707 / / 26.01.2005
Цитата: int
А как в варианте с числом сделать 72.34.*.12?


А какая целесообразность такого фильтра?

12
30 июня 2009 года
alekciy
3.0K / / 13.12.2005
Юзайте PostgreSQL там и IP-шники прекрасно храняться ;)
4.9K
30 июня 2009 года
Valar
81 / / 18.03.2008
Цитата:
А ещё проще - использовать ip2long и long2ip функции php. И в коде просто вычислять крайние long-значения для подаваемой маски. Т.е. для 127.0.0.* берем ip2long("127.0.0.0") и ip2long("127.0.0.255"). И далее в запросе идет обычная проверка на IP: сравнивается он и полученные выше (в прошлом предложении) диапазоны.



Спасибо за интересный вариант. Попробую доработать.

Цитата:
А like чем же не устроил? Меняешь * на % и всё.



=) Улыбнуло. Этот вариант прокатил бы, если дана маска, здесь случай обратный - маска хранится в БД.

Цитата:
Вот интересно, зачем ip-адресу 35 символов? даже в 100.100.100.100/255.255.255.255 всего 31 символ


Совершенно верно, по инерции списал параметры таблицы с другой. Там необходимо было предусмотреть возможность размещения в поле двух ip через запятую (в случае использования прокси), впрочем, к данной задаче это не относится :)

Цитата:
А как в варианте с числом сделать 72.34.*.12?


Цитата:
А какая целесообразность такого фильтра?


Совершенно точно сказано : - )

Цитата:
Юзайте PostgreSQL там и IP-шники прекрасно храняться


Совершенно верно. Я, во общем-то, уже не раз сталкивался с проблемой решения обычной задачи без тривиального решения для MySQL, но, увы, перейти на другую в рамках задачи не могу :-)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог