0

(1.)訪問者が特定の IP アドレス範囲からのみページにアクセスできるようにしたい(段落 2) . IP アドレス リストに IP アドレスの正規表現を追加するだけで簡単に作成できます。

私の正規表現配列は次のとおりです。

$IP_LIST_ACCESS = array(  
"/^188\.133\.11\.([1-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-4]))$/"  
,"/^188\.133\.14\.([1-9]|[1-9][0-9]|1([0-1][0-9]|2[0-8]))$/"  
,"/^127\.0\.0\.1$/"                                                         
);

(2.)上記の配列の IP 範囲は188.133.11.1-188.133.11.254and 188.136.14.1-188.136.14.128andです127.0.0.1

以下は、間違ったIPアドレスを検出して死ぬための私のコードです:

$USER_IP_ADDR = $_SERVER['REMOTE_ADDR'];
foreach ($IP_LIST_ACCESS as $IP_ACC_ARRAY)
{
  if (!preg_match($IP_ACC_ARRAY, $USER_IP_ADDR))
  {
    echo '#INVALID IP'; #DEBUG
    die;
  }
}

(3.)上記のコードでは、常にINVALID IPエラーが発生します(常に間違ったIPアドレスとして検出されます)。
問題はどこだ ?

EDIT
(4.)私はこれをやりたいだけで、より良い方法がある場合はpreg_matchと正確ではありません。

4

3 に答える 3

3

正規表現の代わりに ip2long を使用すると、読みやすく、パフォーマンスが向上します。

$ip_ranges = array(
    array(
        'from' => ip2long('188.133.11.1'),
        'to' => ip2long('188.133.11.254')
    ),
    array(
        'from' => ip2long('188.136.14.1'),
        'to' => ip2long('188.136.14.128')
    ),
    array(
        'from' => ip2long('127.0.0.0'),
        'to' => ip2long('127.255.255.255')
    ),
);

$USER_IP_ADDR = $_SERVER['REMOTE_ADDR'];
$USER_IP_ADDR_LONG = ip2long($USER_IP_ADDR);

$USER_IS_PERMITTED = false;
foreach ($ip_ranges as $ip_range) {
    if ($ip_range['from'] <= $USER_IP_ADDR_LONG && $ip_range['to'] >= $USER_IP_ADDR_LONG) {
        $USER_IS_PERMITTED = true;
    }
}


if (!$USER_IS_PERMITTED) {
    echo '#INVALID IP: ' . $USER_IP_ADDR; #DEBUG
    die;
}
于 2012-12-29T10:57:11.063 に答える
1

を見てくださいip2long()。IPv4 インターネット ネットワーク アドレスは、インターネット標準形式 (ドット付き文字列) 表現から生成されます。

後で、範囲操作を実行できます。

于 2012-12-29T10:54:53.100 に答える
0

私はあなたが望むと確信していますif (preg_match($IP_ACC_ARRAY, $USER_IP_ADDR) === 1)。現在、一致しない場合はエラーが表示されています。これは最も速い解決策ですが、おそらくip2long他の回答で提案されているベースの解決策が最も正しいです。

于 2012-12-29T10:59:39.130 に答える