Страница 1 из 1

Скриптик

Добавлено: 2008-12-01 16:16:56
drill
Всем привет! Помогите пожалуйста скриптиком.
Нужно чтобы скриптик инклудил хтмлку из файла в страницу, если у юзера который пришёл на эту страницу IP-адрес любой, кроме 10.0.0.0 192.168.0.0.
Долго искал, но так и не осилил.
Спасибо!

Re: Скриптик

Добавлено: 2008-12-01 18:01:27
drill
всё-таки осилил.

вот что у меня получилось:

Код: Выделить всё

<?

function getip()
{
  if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"),"unknown"))
    $ip = getenv("HTTP_CLIENT_IP");

  elseif (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
    $ip = getenv("HTTP_X_FORWARDED_FOR");

  elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
    $ip = getenv("REMOTE_ADDR");

  elseif (!empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
    $ip = $_SERVER['REMOTE_ADDR'];

  else
    $ip = "unknown";

  return($ip);
}

function ip_vs_net($ip,$network,$mask){
   if (((ip2long($ip))&(ip2long($mask)))==ip2long($network)){
       return 1;
   }else{
       return 0;
   }
}

$ipn = getip();

if (ip_vs_net("$ipn","10.0.0.0","255.0.0.0")){
    print "con<BR>";
} elseif (ip_vs_net("$ipn","72.16.0.0","255.255.0.0")){
    print "con<BR>";
} elseif (ip_vs_net("$ipn","192.168.0.0","255.255.255.0")){
    print "con<BR>";
} else {
    print "nocon<BR>";
}


?>

Re: Скриптик

Добавлено: 2008-12-01 19:08:51
zg
drill писал(а):(ip2long($ip))&(ip2long($mask)
в пхп нет беззнакового целого числа, поэтому всё не так радужно как бы тебе хотелось

Код: Выделить всё

var_dump(ip2long('127.255.255.255'));
var_dump(ip2long('128.0.0.0'));
---------------
int(2147483647)
int(-2147483648)
функцию ip2long не используют саму по себе, её используют вместе со sprintf

Код: Выделить всё

var_dump(sprintf('%u', ip2long('127.255.255.255')));
var_dump(sprintf('%u', ip2long('128.0.0.0')));
---------------
string(10) "2147483647"
string(10) "2147483648"
при этом данные получаются типа стринг и их нельзя подвергать бинарной конъюнкции

Ну это так, небольшой ликбез :smile:

Re: Скриптик

Добавлено: 2008-12-02 11:05:24
drill
не совсем понял, мой скриптик работает или нет?
как сделать чтобы он работал правильно?
этот я составил из двух кусков других скриптов которые нашёл с помощью гугла

Re: Скриптик

Добавлено: 2008-12-03 17:50:06
zg
скажи, а чего тебе надо добиться?

Re: Скриптик

Добавлено: 2008-12-03 18:07:06
drill
есть сайт, у которого 80% посетителей из сетки, и 20% из инета. Хочу повесить на сайт контекстную рекламу, но хочу показывать её только тем кто из инета. Тем кто из сетки рекламу показывать не хочу.

Re: Скриптик

Добавлено: 2008-12-03 18:21:11
zg
гуд, ща чего-нить подмахнём :smile:

Re: Скриптик

Добавлено: 2008-12-03 18:42:53
zg

Код: Выделить всё

<?

function applyNetMask($ip, $mask)
{
	if ( is_string($ip  ) ) $ip   = ip2long($ip  );
	if ( is_string($mask) ) $mask = ip2long($mask);
	
	return long2ip(sprintf('%u', $ip & $mask));
}

function isLocalIp( $ip )
{
	if ( '192.168.0.0' === applyNetMask($ip, '255.255.0.0') ) return true;
	if ( '10.0.0.0'    === applyNetMask($ip, '255.0.0.0'  ) ) return true;
	if ( '127.0.0.0'   === applyNetMask($ip, '255.0.0.0'  ) ) return true;
	if ( '72.16.0.0'   === applyNetMask($ip, '255.255.0.0') ) return true;
	
	return false;
}

echo '<pre>';

echo '192.168.56.12 is ', isLocalIp('192.168.56.12') ? 'local' : 'world', PHP_EOL;
echo '127.123.41.21 is ', isLocalIp('127.123.41.21') ? 'local' : 'world', PHP_EOL;
echo '79.45.67.12   is ', isLocalIp('79.45.67.12'  ) ? 'local' : 'world', PHP_EOL;
echo '10.23.42.122  is ', isLocalIp('10.23.42.122' ) ? 'local' : 'world', PHP_EOL;

?>
-----------------------------------------
192.168.56.12 is local
127.123.41.21 is local
79.45.67.12   is world
10.23.42.122  is local
вроде пашет :smile:

Re: Скриптик

Добавлено: 2008-12-03 18:59:21
drill
и правда работает, примного благодарен!
СПАСИБО!

Re: Скриптик

Добавлено: 2008-12-03 20:07:06
zg
Гм... даж статью небольшую накидал, чтоб не потерять -))) http://anton-pribora.ru/articles/php-net-mask/

хотя там инфы, по идее, вагон и маленькая тедежка с этими ip

Re: Скриптик

Добавлено: 2008-12-03 22:49:29
Alex Keda
zg писал(а):Гм... даж статью небольшую накидал, чтоб не потерять -))) http://anton-pribora.ru/articles/php-net-mask/

хотя там инфы, по идее, вагон и маленькая тедежка с этими ip
а я на php.net в камментах функцию нашёл...
немного универсальней:

Код: Выделить всё

function net_match($network, $ip) {
      // determines if a network in the form of 192.168.17.1/16 or
      // 127.0.0.1/255.255.255.255 or 10.0.0.1 matches a given ip
      $ip_arr = explode('/', $network);
      $network_long = ip2long($ip_arr[0]);

      $x = ip2long($ip_arr[1]);
      $mask =  long2ip($x) == $ip_arr[1] ? $x : 0xffffffff << (32 - $ip_arr[1]);
      $ip_long = ip2long($ip);

      // echo ">".$ip_arr[1]."> ".decbin($mask)."\n";
      return ($ip_long & $mask) == ($network_long & $mask);
}

Re: Скриптик

Добавлено: 2008-12-03 23:29:41
zg
lissyara писал(а):long2ip($x) == $ip_arr[1] ?
жестоко... -))) но если маска будет больше 32, то будет фигня.

Re: Скриптик

Добавлено: 2008-12-04 0:49:39
Alex Keda
когда будет - тогад перепишется.
на данный момент я живьём их не видел, хотя по слухам на каналах уже внедряют....