PHPでIP制限を行う

$_SERVER[‘REMOTE_ADDR’]にIPアドレスが入るので,これを用いてIP制限を行う。
また,123.234.0.0/8など,サブネットマスクにも対応する。

// 許可IPリスト
$allowIpList = array(
	'123.234.0.2',
	'321.123.10.0/24',
);
 
// リモートIP取得
$thisIp = $_SERVER['REMOTE_ADDR'];
 
// リモートIPをドットで区切る
$thisIpNums = explode('.', $thisIp);
 
// リモートIPを10進数値に変更
$thisIpNum = isset($thisIpNums[3]) ? (
	$thisIpNums[0] * pow(2,24)
	+ $thisIpNums[1] * pow(2,16)
	+ $thisIpNums[2] * pow(2,8)
	+ $thisIpNums[3] * pow(2,0)
	) : 0;
 
// 許可IPリストとのマッチ検索開始
$matchFlag = false;
foreach ($allowIpList as $allowIp) {
	// 許可IPをスラッシュで区切る
	$allowIpArray = explode('/', $allowIp);

	// 許可IPをドットで区切る
	$allowIpNums = explode('.', $allowIpArray[0]);

	// 許可IPを10進数値に変更
	$allowIpNum = isset($allowIpNums[3]) ? (
		$allowIpNums[0] * pow(2,24)
		+ $allowIpNums[1] * pow(2,16)
		+ $allowIpNums[2] * pow(2,8)
		+ $allowIpNums[3] * pow(2,0)
		) : 0;

	// 許可IPのマスクを数値に変更
	$maskNum = isset($allowIpArray[1])  
		? (pow(2,(int)$allowIpArray[1]) - 1) * pow(2, 32 - (int)$allowIpArray[1])
		: pow(2, 32) - 1;

	// リモートIPと許可IPの一致を確認
	if (($thisIpNum & $maskNum) === ($allowIpNum & $maskNum)) {
		$matchFlag = true;
		break;
	}
}

// 一致が無ければIP制限
if (!$matchFlag) {
	// 制限の処理・・・
}