Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вхождение IP
 
 автор: sd607   (06.04.2007 в 22:37)   письмо автору
 
 

Вот такой вот вопрос вылез.

Есть функция:


<?php
function checkIP($filepath) {
        
$ips=file($filepath);

        
$is_in_range=0;

        
$current_ip=ip2long($_SERVER['REMOTE_ADDR']);

        foreach (
$ips as $ip) {
        list(
$start_ip,$end_ip)=explode('-',trim($ip));

        
$start_ip=ip2long($start_ip);
        
$end_ip=ip2long($end_ip);

        if(
$current_ip>=$start_ip && $current_ip<=$end_ip) {
                
$is_in_range=1;
                break;
        }
        }

        unset(
$ips);

        return 
$is_in_range;
}
?>


Есть файл с диапазонами IP вида:
...
85.24.15.0-85.24.22.255
141.25.150.0-141.25.150.255

При вхождении IP клиента в диапазон получаем 1, иначе 0.

Кинут камень в скрипт от пользователя, что возможно не всегда или не точно работает. Посмотрите пожалуйста. Заранее спасибо.

   
 
 автор: cheops   (07.04.2007 в 13:07)   письмо автору
 
   для: sd607   (06.04.2007 в 22:37)
 

Пользователь свой IP-адрес при этом сообщает? Вроде всё нормально должно быть...

   
 
 автор: Holodok   (08.04.2007 в 14:31)   письмо автору
 
   для: cheops   (07.04.2007 в 13:07)
 

ты имеешь представление о хранении целых чисел в памяти? я про современную архитектуру. простой пример, -1 и 255 типа char (один байт) будут выглядеть в памяти одинаково, в то же время (-1<255)==true понимаешь к чему я клоню? ip2long возвращает значение ip адреса (целое знаковое число размером в 4 байта). пхп его обрабатывает и у себя и на более низком уровне сравнивает два знаковых числа, так как в коде пхп они были обьявлены как signed, то сравнение идет уже действительно двух знаковых чисел. и если unsigned результат ip2long был больше (но не более чем на 2^31-1) чем 2^31-1 к примеру, то это число считается уже отрицательным. а отрицательное меньше положительного в результате, хотя как тебе кажется - больше
---
кстати, так к слову, если есть число a, то -a получается простой инверсией битов и прибавлением единицы.

<?  
$first
="0.0.0.0";  
$last="255.255.255.254";  
$check="192.0.34.166";  
// 
$check_d=sprintf("%u",ip2long($check));
$first_d=sprintf("%u",ip2long($first));
$last_d=sprintf("%u",ip2long($last));  
//  
if( ($check_d>=$first_d) && ($check_d<=$last_d) )  {  
//xek 
 
echo 'Входит в диапозон';  }  
?>
Вот примерно.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования