私が働いている会社のウェブサイトを作成しました。
サブネットマスクを使用してユーザープリセットへのアクセスを制限したいと思います。これはPHPで可能ですか?IPは既知です。
3 に答える
あなたが質問した方法は?いいえ。サーバー側からクライアントのサブネットマスクを判別することはできません。
ただし、サーバー側で独自のネットワークとマスクを定義して、クライアントIPを照合し、アクセスを許可するかどうかを決定することはできます。最初にサブネット化がどのように機能するかを確認してから、ip2long()
関数とビット演算を使用して特定のネットワークセグメントへのアクセスを許可する必要があります。
ただし、正直なところ、IPアドレスでアクセスを制限する場合は、ほとんどの場合、アプリケーションではなく、ネットワーク/ファイアウォールレベルでこれを実行します。
それは簡単です。特定のIPアドレスの「サブネット」マスクはです255.255.255.255
。
サブネットマスクとサブネットは、IPアドレスの範囲を定義します。
したがって、IPアドレスからサブネットマスクを収集するには、サブネットが必要です。
上記の私の皮肉な答えは、サブネットとIPアドレスが同じであることを前提としています。すべての4x255ビットがサブネットに使用され、IPアドレスに使用できるビットがなくなるため、この技術は不可能です。
私はこれがあなたが達成しようとしていることをするかもしれないと信じています:
http://php.net/manual/en/function.ip2long.phpを参照してください
<?php
/**
* Check if a client IP is in our Server subnet
*
* @author david dot schueler at tel-billig dot de
* @param string $client_ip
* @param string $server_ip
* @return boolean
*/
function clientInSameSubnet($client_ip=false,$server_ip=false) {
if (!$client_ip)
$client_ip = $_SERVER['REMOTE_ADDR'];
if (!$server_ip)
$server_ip = $_SERVER['SERVER_ADDR'];
// Extract broadcast and netmask from ifconfig
if (!($p = popen("ifconfig","r"))) return false;
$out = "";
while(!feof($p))
$out .= fread($p,1024);
fclose($p);
// This is because the php.net comment function does not
// allow long lines.
$match = "/^.*".$server_ip;
$match .= ".*Bcast:(\d{1,3}\.\d{1,3}i\.\d{1,3}\.\d{1,3}).*";
$match .= "Mask:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/im";
if (!preg_match($match,$out,$regs))
return false;
$bcast = ip2long($regs[1]);
$smask = ip2long($regs[2]);
$ipadr = ip2long($client_ip);
$nmask = $bcast & $smask;
return (($ipadr & $smask) == ($nmask & $smask));
}
?>