接続クライアントのMACおよびIPアドレスを知る必要があります。これをPHPで行うにはどうすればよいですか?
接続クライアントのMACおよびIPアドレスを知る必要があります。これをPHPで行うにはどうすればよいですか?
回答:
サーバーのIPアドレスはから取得できます$_SERVER['SERVER_ADDR']
。
MACアドレスについてはnetstat -ie
、Linuxでの出力を解析できます。ipconfig /all
Windowsのます。
からクライアントIPを取得できます $_SERVER['REMOTE_ADDR']
クライアントの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];
}
}
まあ、クライアントボランティアにその情報を提供して他の方法で送信できない限り、あなたは運が悪いです。
クライアントのMACアドレス(HTTP要求を発行したコンピューターの意味で)は、クライアントとサーバー間のすべてのルーターによって上書きされます。
クライアントIPは、のスクリプトに便利に提供され$_SERVER['REMOTE_ADDR']
ます。Webサーバーがプロキシの背後にある場合は特にいくつかのシナリオ、(すなわちキャッシングプロキシ)で$_SERVER['REMOTE ADDR']
のIP戻りますプロキシを、余分な価値があるだろう、多くの場合$_SERVER['HTTP_X_FORWARDED_FOR']
、それは元の要求クライアントのIPが含まれています。
時々、特にあなたが制御していない匿名化プロキシを扱っている場合、プロキシは実際のIPアドレスを返さず、期待できるのはプロキシのIPアドレスだけです。
PHPではMACアドレスを取得できないと思いますが、$_SERVER['REMOTE_ADDR']
変数からIPを取得できます。
Windowsサーバーの場合、これを使用できると思います。
<?php
echo exec('getmac');
?>
exec
`echogetmac
あなたがする必要があるのは、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
コマンドの出力が表示されます。
arp
バイナリのグループを変更することは冗長ですがwww-data
、other
umode からの実行権限を持っています。
このクラスを使用(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);
?>
次の解決策を使用して問題を解決できます。
$mac='UNKNOWN';
foreach(explode("\n",str_replace(' ','',trim(`getmac`,"\n"))) as $i)
if(strpos($i,'Tcpip')>-1){$mac=substr($i,0,17);break;}
echo $mac;
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"
}
おそらく、Macアドレスを取得することは、インターネット経由でクライアントのマシンを検証するための最良のアプローチではありません。代わりに、管理者のログインによってクライアントのブラウザに保存されているトークンの使用を検討してください。
したがって、クライアントがこのトークンを持つことができるのは、管理者がブラウザを介してトークンを付与した場合のみです。トークンが存在しないか有効でない場合、クライアントのマシンは無効です。
このコードを使用して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 //これは表示専用の偽のアドレスになります。
// 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でも機能します。
これは、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アドレス、ホスト名があります。