
あるIP以外のアクセスを制限する場合は、以下処理で良いものと思っています。
if ("210.161.126.144" != $REMOTE_ADDR){
# アクセス制限の関数呼び出し
hoge2();
}
今回、サブネットマスクを用いて、ある範囲のIPにのみアクセス許可をしたいと思っています。
例えば、以下の範囲のIPのみ許したいと思います。
210.161.126.144-210.161.126.159
実際には、プリフィックスを用いた 210.161.126.144/28 の形で許可IPのデータを持つつもりです。
この場合、どのような処理を行ったらよいのでしょうか?
サブネットマスク含めネットワークの知識が足りない為か、ロジックがとても思いつきません。
210.161.126.144/28 から、210.161.126.144-210.161.126.159を算出する方法もピンときません。
判定処理は関数化してしまい、以下のような感じにしたいと思っております。
$permit_ip = "210.161.126.144/28";
if (!hoge($REMOTE_ADDR,$ip)){
# アクセス制限の関数呼び出し
hoge2();
}
# 引数1のIPが、引数2のIPの範囲内であるか判定する関数
function hoge($p_ip,$p_permit_ip){
if (){
# 範囲内
true;
} else {
# 範囲外
false;
}
}
どうかご教授宜しくお願い致します。
No.4ベストアンサー
- 回答日時:
No.1さんの回答を見て改良しました
<?php
function hoge($p_ip, $p_permit_ip){
list($ip, $mask_bit) = explode("/", $p_permit_ip);
$ip_long = ip2long($ip) >> (32 - $mask_bit);
$p_ip_long = ip2long($p_ip) >> (32 - $mask_bit);
if ($p_ip_long == $ip_long) {
return true;
}
else {
return false;
}
}
$permit_ip = "210.161.126.144/28";
$test_ip = "210.161.126.144";
if (hoge($test_ip, $permit_ip)) echo "OK";
else echo "NG";
?>
サンプルコード、ありがとうございます。
改良後のコードが分かりやすいです。
ビット演算子はこういう時に使うものなんですね。
大変参考になりました。
No.3
- 回答日時:
こうですかね
<?php
function hoge($p_ip, $p_permit_ip){
list($ip, $mask_bit) = explode("/", $p_permit_ip);
$ip_long = ip2long($ip);
$start = ($ip_long >> (32 - $mask_bit)) << (32 - $mask_bit);
$end = $start | (1 << (32 - $mask_bit + 1)) - 1;
$p_ip_long = ip2long($p_ip);
if (($p_ip_long >= $start) and ($p_ip_long <= $end)) {
return true;
}
else {
return false;
}
}
$permit_ip = "210.161.126.145/28";
$test_ip = "210.161.126.159";
if (hoge($test_ip, $permit_ip)) echo "OK";
else echo "NG";
?>
No.2
- 回答日時:
list($a,$b,$c,$d) = explode(".",$IP);
if($a == 210 and $b == 161 and $c == 126) {
if (144 <= $d and $d <= 159) {
#OK
}
}
としたほうが早いような・・・
もしかしたら#1さんのように二進数にしたほうが早いかもしれません。
プレフィックスを使用せずに、許可IPも固定であればそれで十分ではありますが、少々質問の意図とずれてしまっているようです。
せっかくご回答頂いたのに申し訳ありません。
No.1
- 回答日時:
IPアドレス(IPv4)は4つの数字で書かれますが、内部的には32ケタの二進数です。
そのままでは見にくいので、人間にも分かりやすいように8bitずつの四つに区切り、それぞれを10進法表記したのが210.161.126.144の形式です。
だから各項の最大が255 ( 2の8乗ひく1 ) なんですね。
210.161.126.144 および210.161.126.159を二進数で表すと、
11010010 10100001 1111110 10010000
11010010 10100001 1111110 10011111
となり、はじめの28ケタが共通しているのが分かると思います。
この共通部分の長さをプレフィックス長といいます。
この範囲内にアドレスが含まれるとき、そのアドレスは
11010010 10100001 1111110 1001XXXX
という形式をしているはずです。
これに当てはまるかどうか知りたければ、下の4ケタをゼロにしてから
11010010 10100001 1111110 10010000
と同じか判定すればいいですね。
それをするための判定式がサブネットマスクです。
サブネットマスクは、プレフィックス長とおなじ長さだけ1が続き、残りが0の32ケタのビットパターンです。
たとえば今回の例で言えば、初めの28ケタが1で残りがゼロの数字ですから、
11111111 11111111 11111111 11110000
という感じになります。
で、これと元のIPとの「ビットごとのand」を取れば、元のIPの上28ケタはそのままで下4ケタはゼロになります。
「ビットごとのand」というのは、
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
で定められる計算を各ケタにやっているだけです。
http://www.net-newbie.com/tcpip/terms.html
こちらの「ビットごとのAND」の項目などをご参照のこと。
なお、サブネットマスクの1が続く長さをプレフィックス長というのが元々なので、ちょっと説明が変ですがご容赦を。
またPHPでプレフィックス長を含んだIPアドレスの文字列を扱いやすい形に変換する関数が準備されているかどうかは存じません。自作の必要があるかも知れません。
大変わかりやすく、非常に参考になりました!
No.1さんの解説を読んだ後にNo.4さんのサンプルコードを見ましたがロジックの理解が得られました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ファイアウォール IPアドレス 1 2022/06/24 19:46
- ネットワーク IPアドレスの範囲ってどうやって求めるんですか? 2 2023/01/05 01:37
- 固定IP 動的なipと固定ipの混在について 下記ご教授頂ければ幸いです。 新しい機械を社内に導入しようと考え 7 2022/08/07 22:12
- ネットワーク 一台のサーバーに複数個のIPアドレスを追加出来る事は知っていますが、具体的にどうやるのでしょうか? 4 2022/11/03 20:12
- 固定IP iPhoneでのIPv4切り替え方法 3 2022/11/24 22:26
- ネットワーク DHCPのリース期限が半分になった時、WindowsPCはリースの延長をリクエストするかと思います。 2 2023/01/17 09:12
- UNIX・Linux raspberry piを使ったWebサーバー制作をしています、接続するネットワークを変更したときに 1 2023/01/09 15:57
- セキュリティホール・脆弱性 テレワークで会社支給パソコン以外でVPN接続を制限するやり方 教えて下さい 3 2022/08/31 12:40
- サーバー ネットワークの構成に困っています 3 2023/07/05 11:55
- その他(コンピューター・テクノロジー) DHCPサーバーについて、、、。 職場のネットワーク環境で困っています。サーバーはWindows s 3 2023/01/04 10:15
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
-
ピンとくる人とこない人の違いは?直感を鍛える方法を心理コンサルタントに聞いた!
根拠はないがなんとなくそう感じる……。そんな「直感がした」という経験がある人は少なくないだろう。ただ直感は目には見えず、具体的な説明が難しいこともあるため、その正体は理解しにくい。「教えて!goo」にも「...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
アロー演算子について
-
VB.NETからVBAマクロ(引数)を呼...
-
htmlで変数の表示
-
python の import エラー Modul...
-
PHPで連番を繰り返す
-
VB.NETSystem.Xml 要素数を得る...
-
PHPにおいての関数ポインタ(リ...
-
きちんとクラス構造のできた掲...
-
エラーの理由が分りません。Pri...
-
PHP、ヒアドキュメント内でのIF...
-
classの再定義エラーについて
-
PHPプログラム上で「URLを直接...
-
既存関数の上書き
-
PHPでの画像の形式の変換
-
GET変数をディレクトリのように...
-
Yahoo! JAPAN IDを新規取得でき...
-
findstrのerrorlevel
-
ASPでIPアドレスの逆引きした結...
-
データファイルを作成する際に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
PHPの名前空間インポートについて
-
エラーの理由が分りません。Pri...
-
どういうプログラムを関数化を...
-
VB.NETからVBAマクロ(引数)を呼...
-
可変変数にアロー演算子を使いたい
-
Let's Encryptで自動更新がされ...
-
classの再定義エラーについて
-
PHP、ヒアドキュメント内でのIF...
-
protectedなのにアクセスできな...
-
既存関数の上書き
-
[C++]std:mapの扱いを教えて頂...
-
file_existsが動作しない
-
Smarty変数の値をJavascript変...
-
PHPで呼び出し元の関数名の取得...
-
継承クラスで定義したメソッド...
-
UNIX CP "で上書きしません"
-
ローテーションバナー広告について
-
変数の内容が突然変化するのは...
-
stripslashesが効かない!?
おすすめ情報