接続クライアントのMACとIPアドレスを知る必要がありますが、PHPでこれを行うにはどうすればよいですか?
サーバーのIPアドレスは$_SERVER['SERVER_ADDR']
から取得できます。
MACアドレスの場合、Linuxではnetstat -ie
の出力、Windowsではipconfig /all
の出力を解析できます。
$_SERVER['REMOTE_ADDR']
からクライアントIPを取得できます
クライアントのMACアドレスは、1つの特別な状況を除いて利用できません:クライアントがサーバーと同じイーサネットセグメント上にある場合。
したがって、ある種のLANベースのシステムを構築していて、クライアントが同じイーサネットセグメント上でareである場合、解析してMACアドレスを取得できますarp -n
(linux)またはarp -a
(windows)の出力。
編集:外部コマンドの出力を取得する方法をコメントで尋ねます。1つの方法は、バックティックを使用することです。
$ipAddress=$_SERVER['REMOTE_ADDR'];
$macAddr=false;
#run the external command, break output into lines
$arp=`arp -a $ipAddress`;
$lines=explode("\n", $arp);
#look for the output line describing our IP address
foreach($lines as $line)
{
$cols=preg_split('/\s+/', trim($line));
if ($cols[0]==$ipAddress)
{
$macAddr=$cols[1];
}
}
クライアントにその情報をボランティアしてもらい、他の手段で送信できない限り、あなたは運が悪いです。
クライアントのMACアドレス(HTTP要求を発行したコンピューターの意味で)は、クライアントとサーバー間のすべてのルーターによって上書きされます。
クライアントIPは、$_SERVER['REMOTE_ADDR']
のスクリプトに便利に提供されます。一部のシナリオでは、特にWebサーバーがプロキシ(キャッシングプロキシなど)の背後にある場合、$_SERVER['REMOTE ADDR']
はproxyのIPを返し、IPを含む追加の値(多くの場合、$_SERVER['HTTP_X_FORWARDED_FOR']
)があります。元のリクエストクライアントの.
場合によっては、特に制御していない匿名化プロキシを扱っている場合、プロキシは実際のIPアドレスを返さず、期待できるのはプロキシのIPアドレスだけです。
PHPでMACアドレスを取得できるとは思いませんが、$_SERVER['REMOTE_ADDR']
変数からIPを取得できます。
あなたがする必要があるのは、ARPを異なるグループに入れることです。
デフォルト:
-rwxr-xr-x 1 root root 48K 2008-11-11 18:11 /usr/sbin/arp*
コマンド付き:
Sudo chown root:www-data /usr/sbin/arp
あなたが取得します:
-rwxr-xr-x 1 root www-data 48K 2008-11-11 18:11 /usr/sbin/arp*
また、Apacheはユーザーwww-dataの下で実行されるデーモンであるため、このコマンドを実行できるようになりました。
したがって、現在PHPスクリプトを使用している場合、たとえば:
<?php
$mac = system('arp -an');
echo $mac;
?>
linux arp -an
コマンドの出力を取得します。
Windowsサーバーの場合、これを使用できると思います。
<?php
echo exec('getmac');
?>
このクラスを使用(https://github.com/BlakeGardner/php-mac-address)
これは、Unix、Linux、およびMac OS Xオペレーティングシステム上でのMACアドレス操作用のPHPクラスです。主にワイヤレスセキュリティ監査のなりすましを支援するために書かれました。
Windowsでは、ユーザーがスクリプトをローカルで使用している場合、非常に簡単です。
<?php
// get all the informations about the client's network
$ipconfig = Shell_exec ("ipconfig/all"));
// display those informations
echo $ipconfig;
/*
look for the value of "physical adress" and use substr() function to
retrieve the adress from this long string.
here in my case i'm using a french cmd.
you can change the numbers according adress mac position in the string.
*/
echo substr(Shell_exec ("ipconfig/all"),1821,18);
?>