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


136

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


何のIPアドレス?接続しているクライアントの?
Palantir

1
サーバーまたは訪問者のアドレス?
KiNgMaR 09/09/14

13
どのような目的でMACアドレスが必要ですか?ユーザーが変更できることを知っていますか?
ローン侯爵、

@EJP MACアドレスの使用例があります。Webページを要求しているデバイスに基づいて、さまざまな情報を提供したいと考えています。ページをリクエストしているデバイスの固有の情報を取得する別の方法はありますか?
Dante、

回答:


186

サーバーIP

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

サーバーのMACアドレス

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

クライアントIPアドレス

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

クライアントMACアドレス

クライアントのMACアドレスは、1つの特別な状況(クライアントがサーバーと同じイーサネットセグメント上にある場合)を除いて使用できません

したがって、何らかのLANベースのシステムを構築していて、クライアント同じイーサネットセグメント上にある場合、arp -n(linux)またはarp -a(windows)の出力を解析することでMACアドレスを取得できます。

編集:コメントで外部コマンドの出力を取得する方法を尋ねます-一つの方法はバックティックを使用することです、例えば

$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上にない場合はどうなりますか?

まあ、クライアントボランティアにその情報を提供して他の方法で送信できない限り、あなたは運が悪いです。


2
PHPを使用してarp -aの出力を取得する方法?
ネフェーン2009

1
@paulDixonこんにちは、これは古い投稿です。Macアドレスを取得する新しい方法があるのでしょうか。
jcho360 2012年

@ jcho360クライアントのMACアドレスを取得することはまだ不可能です。MACアドレスには通信値がなく、リクエストヘッダーに保存されないため、とにかくそれが起こるとは思いません。
Bearwulf、2007

@Bearwulf返信ありがとうございます。それが私の考えです。サイトに接続されている固有のコンピューターを識別する方法はありますか?
jcho360 2012

6
@ jcho360個人的には、IPアドレス+リクエスト情報の組み合わせを使用して、ハッシュを作成します(例:md5($ _ SERVER ['REMOTE_ADDR']。$ _SERVER ['HTTP_USER_AGENT']);)。それは確かに防弾ではありませんが、その始まりです。より簡単で安全なもう1つの方法は、一意のハッシュを使用してCookieを設定することです。常にそのCookieを使用すると、どのユーザーがWebサイトに接続しているかが確実になります。
Bearwulf

24

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

クライアントIPは、のスクリプトに便利に提供され$_SERVER['REMOTE_ADDR']ます。Webサーバーがプロキシの背後にある場合は特にいくつかのシナリオ、(すなわちキャッシングプロキシ)で$_SERVER['REMOTE ADDR']のIP戻りますプロキシを、余分な価値があるだろう、多くの場合$_SERVER['HTTP_X_FORWARDED_FOR']、それは元の要求クライアントのIPが含まれています。

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


9

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


MAC

MACアドレスはローカルネットワークにのみ表示され、ローカルネットワーク外の任意のデバイスのMACアドレスにアクセスできます。たとえば、MACアドレスはローカルWi-Fiルーターに保存されて表示され、その外部ではネットワーク内のすべてのデバイスが表示されます使用しており、同じIPアドレスで通信されます。このルーターはMACアドレスに変換して内部に送信します。
Dheeraj Thedijje

7

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

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

2
<?php echo exec( 'getmac'); ?> LANでのみ機能しますが、これはすべてのMACアドレスを示します<php system( 'getmac'); ?>
Giorgi Gogitidze 2017年

そしてwindows10も。また、exec`echogetmac
SaidbakR

6

あなたがする必要があるのは、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
これは、ローカルネットワーク上のデバイスのMACアドレスのみを提供します。
duskwuff -inactive- 2011

1
arpバイナリのグループを変更することは冗長ですがwww-dataotherumode からの実行権限を持っています。
deed02392 2014年


1

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


0

この方法でphpでUbuntuでMACアドレスを取得できます

$ipconfig =   shell_exec ("ifconfig -a | grep -Po 'HWaddr \K.*$'");  
    // display mac address   
 echo $ipconfig;

0

PHPを使用したMACアドレスの取得:(Ubuntu 18.04でテスト済み)-2020アップデート

これがコードです:

<?php
    $mac = shell_exec("ip link | awk '{print $2}'");
    preg_match_all('/([a-z0-9]+):\s+((?:[0-9a-f]{2}:){5}[0-9a-f]{2})/i', $mac, $matches);
    $output = array_combine($matches[1], $matches[2]);
    $mac_address_values =  json_encode($output, JSON_PRETTY_PRINT);   
    echo $mac_address_values
?>

出力:

{
    "lo": "00:00:00:00:00:00",
    "enp0s25": "00:21:cc:d4:2a:23",
    "wlp3s0": "84:3a:4b:03:3c:3a",
    "wwp0s20u4": "7a:e3:2a:de:66:09"
}

0

おそらく、Macアドレスを取得することは、インターネット経由でクライアントのマシンを検証するための最良のアプローチではありません。代わりに、管理者のログインによってクライアントのブラウザに保存されているトークンの使用を検討してください。

したがって、クライアントがこのトークンを持つことができるのは、管理者がブラウザを介してトークンを付与した場合のみです。トークンが存在しないか有効でない場合、クライアントのマシンは無効です。


-1

このコードを使用してMACアドレスまたは 物理アドレスを取得できます

$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));  
$d1 = explode(':',$d[1]);  
$d2 = explode(' ',$d1[1]);  
return $d2[1];

shell_exec( "ipconfig / all")がすべてのネットワークの完全な詳細を返すため、私は何度も爆発を使用しました。そのため、1つずつ分割する必要があります。このコードを実行すると
MACアドレス 00-##-##-CV-12 //これは表示専用の偽のアドレスになります。


-2
// Turn on output buffering  
ob_start();  

//Get the ipconfig details using system commond  
system('ipconfig /all');  

// Capture the output into a variable  
$mycomsys=ob_get_contents();  

// Clean (erase) the output buffer  
ob_clean();  

$find_mac = "Physical"; 
//find the "Physical" & Find the position of Physical text  

$pmac = strpos($mycomsys, $find_mac);  
// Get Physical Address  

$macaddress=substr($mycomsys,($pmac+36),17);  
//Display Mac Address  

echo $macaddress;  

これipconfig /allは、Windowsシステムコマンドと同様に、Windowsでも機能します。


5
この答えがあなたに何かを教えてくれるなら、うまくいけば、あなたが理解していないコードをコピー/貼り付けしないことでしょう。OPが要求したことは行いません。
tripleee、2015年

-2

Linuxではiptablesを使用して、MACアドレスとIPを使用してWebサーバーへの各リクエストをファイルに記録できます。PHPからIPアドレスで最後の項目を検索し、MACアドレスを取得します。

前述のように、MACアドレスはトレースの最後のルーターからのものであることを覚えておいてください。


-4

これは、openWRTを使用して簡単に行うことができます。キャプティブポータルを使用する場合は、phpとopenWRTを混合して、IPとMacの間に関係を作成できます。

以下を使用して単純なPHPコードを記述できます。

 $localIP = getHostByName(getHostName()); 

その後、openWRTを使用してにアクセスする/tmp/dhcp.leasesと、次の形式で何かが得られます。

 e4:a7:a0:29:xx:xx 10.239.3.XXX DESKTOP-XXX 

そこには、Mac、IPアドレス、ホスト名があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.