web-dev-qa-db-ja.com

接続されたクライアントのMACとIPアドレスをPHPで取得するにはどうすればよいですか?

接続クライアントのMACとIPアドレスを知る必要がありますが、PHPでこれを行うにはどうすればよいですか?

130
Neveen

サーバーIP

サーバーのIPアドレスは$_SERVER['SERVER_ADDR']から取得できます。

サーバーのMACアドレス

MACアドレスの場合、Linuxではnetstat -ieの出力、Windowsではipconfig /allの出力を解析できます。

クライアントIPアドレス

$_SERVER['REMOTE_ADDR']からクライアントIPを取得できます

クライアントMACアドレス

クライアントの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];
   }
}

しかし、クライアントがLAN上にない場合はどうでしょうか?

クライアントにその情報をボランティアしてもらい、他の手段で送信できない限り、あなたは運が悪いです。

174
Paul Dixon

クライアントのMACアドレス(HTTP要求を発行したコンピューターの意味で)は、クライアントとサーバー間のすべてのルーターによって上書きされます。

クライアントIPは、$_SERVER['REMOTE_ADDR']のスクリプトに便利に提供されます。一部のシナリオでは、特にWebサーバーがプロキシ(キャッシングプロキシなど)の背後にある場合、$_SERVER['REMOTE ADDR']proxyのIPを返し、IPを含む追加の値(多くの場合、$_SERVER['HTTP_X_FORWARDED_FOR'])があります。元のリクエストクライアントの.

場合によっては、特に制御していない匿名化プロキシを扱っている場合、プロキシは実際のIPアドレスを返さず、期待できるのはプロキシのIPアドレスだけです。

22

PHPでMACアドレスを取得できるとは思いませんが、$_SERVER['REMOTE_ADDR']変数からIPを取得できます。

8
RaYell

あなたがする必要があるのは、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コマンドの出力を取得します。

6
McJ

Windowsサーバーの場合、これを使用できると思います。

<?php
echo exec('getmac');
?>
6
Simos

このクラスを使用(https://github.com/BlakeGardner/php-mac-address)

これは、Unix、Linux、およびMac OS Xオペレーティングシステム上でのMACアドレス操作用のPHPクラスです。主にワイヤレスセキュリティ監査のなりすましを支援するために書かれました。

2
Ali

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); 
?>
1
Mirtov