|
|
|
| Вот такой вот вопрос вылез.
Есть функция:
<?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.
Кинут камень в скрипт от пользователя, что возможно не всегда или не точно работает. Посмотрите пожалуйста. Заранее спасибо. | |
|
|
|
|
|
|
|
для: sd607
(06.04.2007 в 22:37)
| | Пользователь свой IP-адрес при этом сообщает? Вроде всё нормально должно быть... | |
|
|
|
|
|
|
|
для: 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 'Входит в диапозон'; }
?>
| Вот примерно. | |
|
|
|