ケータイアクセスのみに限る方法(IPアドレスで見る方法)

手っ取り早く?、IPアドレスを32bit intにして比較する、って方法にしました。
長くなるんでー。

チェックするためのクラス。

define ( "IPLIST_DOCOMO"    , 1 ) ;
define ( "IPLIST_KDDI"      , 2 ) ;
define ( "IPLIST_SOFTBANK"  , 3 ) ;

class IPchecker {
     private $__iplist ;

     function __construct( ) {
        require_once( 'iplist.php' ) ;
     }

     function checkfrom( $remote_ip  ) {
        $__outrange = FALSE ;
        foreach( $this->__iplist as $__target_iplist) {
           $__source_ipaddr = $this->convip( $remote_ip ) ;
           foreach( $__target_iplist as $__listary ) {
              if ( $__listary[0] <= $__source_ipaddr &&
                   $__listary[1] >= $__source_ipaddr   ) {
                   $__outrange = $__source_ipaddr ;
              }
           }
        }
        return $__outrange ;
     }

     // 123.45.67.89 形式を、0x7b2d4359 (32bit int) にする
     function convip( $remote_ip ) {
        if ( mb_ereg( "([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)"
                    , $remote_ip , $__op ) ) {
            $__ip32 = sprintf( "%02x%02x%02x%02x",
                               $__op[1],$__op[2],$__op[3],$__op[4]) ;
            $__retval = hexdec( $__ip32 ) ;
        } else {
            $__retval = FALSE ;
        }
        return $__retval ;
     }
}

やりかたはこんなかんじ。

$ipchk = new IPchecker() ;
if ( $ipchk->checkfrom( $_SERVER['REMOTE_ADDR'] ) === FALSE ) {
   // 拒絶するコードを書く
}

iplist.phpを作るためのジェネレータはこんなかんじで作ってます。
自分用(笑)。
ローカルでしか動かさないことを前提としてますので、このまま公開するとチョー危険です。絶対にやらないでください!

<TITLE>IP ADDRESS LIST CONVERTER</TITLE>
<STYLE type-"text/css">
<!--
div.outsrc { border: 1px solid #000080 ;
             overflow: auto ;
             width: 700px ;
             height: 240px ;
}
-->
</STYLE>
<H1>IP ADDRESS LIST CONVERTER</H1>
<PRE>
<?php
$out2 = "" ;
if ( isset( $_POST['iplist'] ) ) {
   if ( $_POST['carrier']=="IPLIST_KDDI" ) {
      $in20 = explode( "\n" , $_POST['iplist'] ) ;
      $ipdata = "" ; $in2 = array() ;
      foreach( $in20 as $in3 ) {
        if ( mb_ereg("^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)",$in3,$p) ) {
           $ipdata = sprintf("%03d.%03d.%03d.%03d",$p[1],$p[2],$p[3],$p4[4]);
        }
        if ( mb_ereg("^/([0-9]+)",$in3,$p) ) {
           $ipblk = sprintf("%s/%2d" , $ipdata , $p[1] ) ;
           array_push( $in2 , $ipblk ) ;
           $ipdata = "" ;
        }
      }
   } else {
      $in2 = explode( "\n" , $_POST['iplist'] ) ;
   }
   $carrier = $_POST['carrier'] ;
   $prog_source = "\$this->__iplist[$carrier] = array (\n" ;
}

if ( count( $in2 ) > 0 ) {
   $i =0 ;
   foreach ( $in2 as $in ) {
     if ( mb_ereg( "([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/([0-9]+)"
                    , $in , $op ) ) {
        $i ++ ;
        $opex = sprintf( "%02x%02x%02x%02x",$op[1],$op[2],$op[3],$op[4]) ;
        $opblk1 = hexdec( $opex ) ;
        $rmks = sprintf( "[%2d] ipblock=%03d.%03d.%03d.%03d/%2d (%s) " ,
                $i,$op[1],$op[2],$op[3],$op[4],$op[5],$opex );
        print $rmks ;
        print "&nbsp;&nbsp;==&gt;" ;
        $opef = 32 - $op[5] ;
        $opbit = pow( 2 , $opef ) ;
        $opblk2 = $opblk1 + $opbit - 1 ;
        printf( "start:%08x -- end:%08x\n" , $opblk1 , $opblk2 ) ;
        $linec = sprintf("\tarray( 0x%08x , 0x%08x ) ," ,
                         $opblk1 , $opblk2 ) ;
        $linec .= "\t// $rmks\n" ;
        $prog_source .= $linec ;
     }
  }
  $out2 = htmlspecialchars( $_POST['iplist'] ) ;
  switch( $_POST['carrier'] ) {
  case "IPLIST_DOCOMO"   : $sel_d = "selected" ; break ;
  case "IPLIST_KDDI"     : $sel_k = "selected" ; break ;
  case "IPLIST_SOFTBANK" : $sel_s = "selected" ; break ;
  }
  $prog_source .= ");\n" ;
}
?>
</PRE>
<H2>output source</H2>
<DIV class="outsrc">
<PRE>
<?php echo $prog_source ; ?>
</PRE>
</DIV>
<br /><br />
<form action="test.php" method="POST">
select carrier! --&gt; <SELECT name="carrier">
  <OPTION value="IPLIST_DOCOMO"   <?php echo $sel_d ; ?> >DoCoMo</OPTION>
  <OPTION value="IPLIST_KDDI"     <?php echo $sel_k ; ?> >au(KDDI)</OPTION>
  <OPTION value="IPLIST_SOFTBANK" <?php echo $sel_s ; ?> >Softbank</OPTION>
</SELECT><br />
<TEXTAREA name="iplist" rows="15" cols="40">
<?php echo $out2 ; ?>
</TEXTAREA>
<INPUT type="submit" value="GET!">
</form>

フォームに各キャリアのサイトにあるIPアドレス一覧部分をテキトーにコピー&ペーストすると、自動的に生成してくれます。事前にいじったりする必要はありません!
こんなかんじ↓
2009112601

参考

Comments are closed.