ある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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPの名前空間インポートについて
-
AUTO_INCREMENTの動作について
-
エラーの理由が分りません。Pri...
-
python の import エラー Modul...
-
VBA コレクションに2次元配列...
-
変数によるクラスの呼び出しが...
-
VB.NETSystem.Xml 要素数を得る...
-
Type.GetMethodで困っています
-
VB6のコンボボックスのテキスト...
-
Dosブロンプトでtabを出力したい
-
wordの差し込み印刷で文字...
-
shシェルスクリプト 空白行の...
-
開始と終了を指定して、その間...
-
EXCEL、マクロ-改ページ行番号...
-
バッチファイルでpingの結果を...
-
VB or VBScriptでPCの製造番号...
-
vb2005でhtmlからテキストのみ...
-
ThreadのHandleの取得方法を教...
-
「取得先」という表現について
-
ImmGetConversionListについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
VB.NETからVBAマクロ(引数)を呼...
-
classの再定義エラーについて
-
可変変数にアロー演算子を使いたい
-
ASPのResponse.WriteをPHPでは...
-
PHPの名前空間インポートについて
-
protectedなのにアクセスできな...
-
条件式 ! char[0] とは
-
PHPの変数値をリンクさせたい
-
PHP、ヒアドキュメント内でのIF...
-
fwriteで改行出来ない
-
vb作成したらでbeep音が鳴りま...
-
Smarty変数の値をJavascript変...
-
UNIX CP "で上書きしません"
-
変数に格納できる桁数に制限は...
-
正規表現 ファイル名の取得
-
PHPで連番を繰り返す
-
Type.GetMethodで困っています
-
PHPでの画像の形式の変換
おすすめ情報