[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проверка ip
tar
В базе данных есть запись диапазона ip-адресов (например: 81.213.108.0/81.213.108.24)
Как проверить пришедший ip-адрес (есть ли он в этом диапазоне)




Спустя 5 минут, 33 секунды (2.08.2010 - 23:33) Ice написал(а):
Если речь идет о MySQL, то:
SELECT COUNT(*) FROM ... WHERE ip='...'

Или если IP хранится в базе в целочисленном формате, что более правильно, тогда так:
SELECT COUNT(*) FROM ... WHERE ip BETWEEN 1372941312 AND 1372941326


Ну, и соответственно, скрипт-обработчик:

$sql = "SELECT COUNT(*)
FROM ...
WHERE ip BETWEEN 1372941312
AND 1372941326"
;
$query = mysql_query( $sql );
if( mysql_result( $query, 0) > 0 ) {
print 'IP разрешен';
} else {
print 'IP запрещен';
}

Спустя 20 минут, 53 секунды (2.08.2010 - 23:54) arvitaly написал(а):
$ip = str_replace(".","",$_SERVER['REMOTE_ADDR']);    
if (mysql_num_rows(mysql_query('SELECT IP FROM baseip where REPLACE(SUBSTR(ip,1,INSTR(ip,"/")-1),".","")+0<=' . $ip . ' AND REPLACE(SUBSTR(ip,INSTR(ip,"/")+1),".","")+0>=' . $ip . ' limit 0,1')))
{
echo "Доступ для этого IP - " . $ip . " разрешен";
}
else
{
echo "Доступ для этого IP - " . $ip . " запрещен";
exit;
}

Спустя 3 минуты, 59 секунд (2.08.2010 - 23:58) tar написал(а):
Спасибо - проверю

Спустя 1 минута, 13 секунд (2.08.2010 - 23:59) arvitaly написал(а):
Ты мой код пробовал?

Спустя 5 минут, 19 секунд (3.08.2010 - 00:04) Ice написал(а):
Цитата (arvitaly @ 3.08.2010 - 00:59)
Ты мой код пробовал?



$ip = str_replace(".","",$_SERVER['REMOTE_ADDR']);
Зачем такой велик, когда есть ip2long и long2ip?

echo "Доступ для этого IP - " . $ip . " запрещен";
Выведет
Доступ для этого IP - 127001 запрещен

недоработка.


Работает на треть без малого в полтора раза медленнее моего варианта.

Спустя 34 минуты, 16 секунд (3.08.2010 - 00:39) tar написал(а):
Действительно - постоянно выводит в локале "Доступ для этого IP - 127001 запрещен"


Первый вариант не понял.
При сотнях записей диапазонов в базе - получается мне придется написать сотню
SELECT COUNT(*)

Спустя 2 минуты, 34 секунды (3.08.2010 - 00:41) Ice написал(а):
нет, придется написать сотню условных выражений.
Цитата
Действительно - постоянно выводит в локале "Доступ для этого IP - 127001 запрещен"

Здесь в первую очередь хотел обратить внимание во что превратился сам айпишник благодаря новому велосипеду, а доступ-то будет запрещен, диапазон-то не тот.

Спустя 5 минут, 36 секунд (3.08.2010 - 00:47) arvitaly написал(а):
Только Ваш вариант - это не решение поставленной задачи, так как данные хранятся в другом формате (как в моем примере)

Спустя 1 минута, 20 секунд (3.08.2010 - 00:48) Ice написал(а):
Данные в таком формате храниться не должны.

Спустя 4 минуты, 32 секунды (3.08.2010 - 00:53) Guest написал(а):
$ip = "81.213.108.10";
$ip_range = "81.200.108.0/81.213.108.24";

$range = explode("/", $ip_range);
if($range[1] > $ip && $range[0] < $ip)
echo "ok";

Спустя 23 минуты, 20 секунд (3.08.2010 - 01:16) arvitaly написал(а):
Данные в таком формате храниться не должны.


Не могу не согласиться

tar

По уму сделай просто еще одно поле: в первом начало диапазона, во втором конец и оба int

Спустя 7 часов, 21 минута, 3 секунды (3.08.2010 - 08:37) tar написал(а):
Cлучай, когда вопрос нужно конкретизировать.
В базе хранится сотни статичных ip адресов и сотня диапазонов ip адресов.
Как проверить одним! запросом входящий ip адрес.
В каком представлении будет записано в базе меня не интересует.

Спустя 9 часов, 25 минут, 52 секунды (3.08.2010 - 18:03) skeletor написал(а):
Непонятно в каком формате у тебя храниться БД IP-адресов.
1.1.1.1
1.1.12.2-1.1.12.10
1.1.14.5/24
1.1.12.2-10
1.2.14.5/255.255.255.0

или ещё в каком-то формате.

Спустя 2 часа, 5 минут, 24 секунды (3.08.2010 - 20:08) tar написал(а):
Например

В таком:
81.213.100.0
И в таком:
81.213.108.0/81.213.108.24

Но можна переделать.
Можна сдепать, как предлагалось два поля с меньшим и большим значениями.
Для меня главное алгоритм.

Спустя 3 минуты, 19 секунд (3.08.2010 - 20:12) arvitaly написал(а):
Ну а больше никакого алгоритма, ICE уже писал решение

Спустя 49 минут, 11 секунд (3.08.2010 - 21:01) tar написал(а):
Огромное спасибо всем !
Я соединил Ваши предложения и получилось.

Выложу кусочек кода - может кому-то пригодится.
Извините за стиль написания - главное алгоритм, как мне кажется.


--
--
Структура таблицы `db_bad_robots`
--
CREATE TABLE `db_bad_robots` (
`selector` int(11) NOT NULL,
`ip_bad_1` bigint(15) NOT NULL,
`ip_bad_2` bigint(15) NOT NULL,
`date1` text,
`comment` text,
KEY `selector` (`selector`)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251;



//*************************************************************************

if (stristr($_SERVER['HTTP_USER_AGENT'], 'Yandex')){ $bot='Yandex';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'Googlebot')){$bot='Google';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'Mediapartners-Google')){$bot='Mediapartners-Google';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'Slurp')){$bot='Hot Bot search';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'WebCrawler')){$bot='WebCrawler search';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'ZyBorg')){$bot='Wisenut search';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'scooter')){$bot='AltaVista';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'StackRambler')){$bot='Rambler';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'lycos')){$bot='Lycos';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'WebAlta')){$bot='WebAlta';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'yahoo')){$bot='Yahoo';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'msnbot')){$bot='msnbot/1.0';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'ia_archiver')){$bot='Alexa search engine';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'FAST')){$bot='AllTheWeb';}
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'google') ) {$bot='Google 2';}
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'stack') ) {$bot='Rambler';}
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'aport') ) {$bot='Aport';}
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'fast') ) {$bot='Fast Search';}
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'rambler') ) {$bot='Rambler 2';}
elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'SolomonoBot/1.01') ) {$bot='SolomonoBot/1.01';}
else
{
$hostname = gethostbyaddr($_SERVER["REMOTE_ADDR"]);
$bot="$hostname";
}

if (isset($_SERVER["HTTP_USER_AGENT"]))
{$who=$_SERVER["HTTP_USER_AGENT"];}
else {$who="";}

if (!empty($_SERVER['HTTP_CLIENT_IP']))
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
$ip_0 = str_replace(".","",$ip);


if ( $bot == "$hostname" )
{
$date1 = date ( "Y.m.d H:i" );
$limit = 13 ;

$rb = $db->query ( "SELECT * FROM db_bad_robots WHERE $ip_0 BETWEEN ip_bad_1 AND ip_bad_2 and selector <> '0' " );
$bad = mysql_numrows ( $rb );

if ($bad > 0 )
{
sleep(5);
}


$rs = $db->query ( "SELECT * FROM db_bad_robots WHERE ip_bad_1 >= '$ip_0' and date1='$date1' " );
$num = mysql_numrows ( $rs );


if ( $num < $limit )
{
$db->query ( "INSERT INTO db_bad_robots (selector, ip_bad_1, ip_bad_2, date1, comment)
VALUES ( '0', '
$ip_0', '$ip_0', '$date1', '$who') " ) ;
}

if ( $num == $limit )
{
$rw = $db->query ( "SELECT selector FROM db_bad_robots ORDER BY selector DESC LIMIT 1" );
$fw = $db->fetcharray ($rw);
$num1 = $fw[selector];
$num2 = $num1+1;

$db->query ( "INSERT INTO db_bad_robots (selector, ip_bad_1, ip_bad_2, date1, comment)
VALUES ( '
$num2', '$ip_0', '$ip_0', '$date1', '$who') " ) ;
sleep(5);
}

$rk = $db->query ( "SELECT selector FROM db_bad_robots WHERE selector = '0' " );
$num3 = mysql_numrows ( $rk );


if ( $num3 > $limit )
{
$db->query ("DELETE FROM db_bad_robots WHERE selector = '0' ");
$db->query ("OPTIMIZE TABLE db_bad_robots ");
}
}

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.