Saya perlu mengetahui MAC dan alamat IP dari klien yang terhubung, bagaimana saya bisa melakukan ini di PHP?
Saya perlu mengetahui MAC dan alamat IP dari klien yang terhubung, bagaimana saya bisa melakukan ini di PHP?
Jawaban:
Anda bisa mendapatkan alamat IP server dari $_SERVER['SERVER_ADDR']
.
Untuk alamat MAC, Anda dapat mengurai keluaran netstat -ie
di Linux, atau ipconfig /all
di Windows.
Anda bisa mendapatkan IP klien dari $_SERVER['REMOTE_ADDR']
Alamat MAC klien tidak akan tersedia untuk Anda kecuali dalam satu keadaan khusus: jika klien berada di segmen ethernet yang sama dengan server.
Jadi, jika Anda membangun beberapa jenis sistem berbasis LAN dan klien Anda berada di segmen ethernet yang sama, maka Anda bisa mendapatkan alamat MAC dengan mem-parsing keluaran arp -n
(linux) atau arp -a
(windows).
Edit : Anda bertanya dalam komentar bagaimana mendapatkan output dari perintah eksternal - salah satu caranya adalah dengan menggunakan backticks, mis
$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];
}
}
Nah, Anda kurang beruntung kecuali Anda dapat meminta klien memberikan informasi itu secara sukarela dan mengirimkannya melalui cara lain.
Alamat MAC klien (dalam arti komputer yang mengeluarkan permintaan HTTP) ditimpa oleh setiap router antara klien dan server.
IP klien dengan mudah disediakan untuk skrip di $_SERVER['REMOTE_ADDR']
. Dalam beberapa skenario, terutama jika server web Anda berada di belakang proxy (yaitu proxy cache) $_SERVER['REMOTE ADDR']
akan mengembalikan IP proxy , dan akan ada nilai tambahan, seringkali $_SERVER['HTTP_X_FORWARDED_FOR']
, yang berisi IP klien permintaan asli.
Terkadang, terutama saat Anda berurusan dengan proxy anonim yang tidak Anda kendalikan, proxy tidak akan mengembalikan alamat IP asli, dan yang dapat Anda harapkan hanyalah alamat IP dari proxy tersebut.
Saya tidak berpikir Anda bisa mendapatkan alamat MAC di PHP, tetapi Anda bisa mendapatkan IP dari $_SERVER['REMOTE_ADDR']
variabel.
Untuk windows server saya pikir Anda bisa menggunakan ini:
<?php
echo exec('getmac');
?>
exec
hanya ʻechogetmac
Yang perlu Anda lakukan adalah memasukkan arp ke dalam grup yang berbeda.
Default:
-rwxr-xr-x 1 root root 48K 2008-11-11 18:11 /usr/sbin/arp*
Dengan perintah:
sudo chown root:www-data /usr/sbin/arp
kamu akan mendapatkan:
-rwxr-xr-x 1 root www-data 48K 2008-11-11 18:11 /usr/sbin/arp*
Dan karena apache adalah daemon yang berjalan di bawah data www pengguna, sekarang ia dapat menjalankan perintah ini.
Jadi jika sekarang Anda menggunakan script PHP, misalnya:
<?php
$mac = system('arp -an');
echo $mac;
?>
Anda akan mendapatkan output dari arp -an
perintah linux .
arp
biner adalah redundan, www-data
masih memiliki izin eksekusi dari other
umode.
Gunakan kelas ini (https://github.com/BlakeGardner/php-mac-address)
Ini adalah kelas PHP untuk manipulasi alamat MAC di atas sistem operasi Unix, Linux dan Mac OS X. itu terutama ditulis untuk membantu spoofing untuk audit keamanan nirkabel.
Di windows, Jika pengguna menggunakan skrip Anda secara lokal, itu akan sangat sederhana:
<?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);
?>
Anda dapat menggunakan solusi berikut untuk menyelesaikan masalah Anda:
$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;
Mendapatkan Alamat MAC Menggunakan PHP: (Diuji di Ubuntu 18.04) - Pembaruan 2020
Inilah Kodenya:
<?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
?>
Keluaran:
{
"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"
}
Mungkin mendapatkan alamat Mac bukanlah pendekatan terbaik untuk memverifikasi mesin klien melalui internet. Pertimbangkan untuk menggunakan token sebagai gantinya yang disimpan di browser klien dengan login administrator.
Oleh karena itu, klien hanya dapat memiliki token ini jika administrator memberikannya melalui browser mereka. Jika token tidak ada atau valid maka mesin klien tidak valid.
terlambat untuk menjawab tetapi inilah pendekatan saya karena tidak ada yang menyebutkan ini di sini:
mengapa mencatat solusi sisi klien?
implementasi javascript untuk menyimpan mac dalam cookie (Anda dapat mengenkripsinya sebelum itu)
maka setiap permintaan harus menyertakan nama cookie itu, jika tidak maka akan ditolak.
untuk membuatnya lebih menyenangkan, Anda dapat membuat verifikasi sisi server
dari alamat mac yang Anda dapatkan manifacturernya (ada banyak API gratis untuk ini)
lalu bandingkan dengan nilai user_agent untuk melihat apakah ada semacam manipulasi:
a mac alamat HP + agen pengguna Safari = tolak permintaan.
Anda bisa mendapatkan Alamat MAC atau Alamat Fisik menggunakan kode ini
$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));
$d1 = explode(':',$d[1]);
$d2 = explode(' ',$d1[1]);
return $d2[1];
Saya sering meledak karena shell_exec ("ipconfig / all") mengembalikan detail lengkap dari semua jaringan. jadi kalian harus membaginya satu per satu. ketika Anda menjalankan kode ini maka Anda akan mendapatkan Alamat MAC
Anda 00 - ## - ## - CV-12 // ini adalah alamat palsu untuk pertunjukan saja.
// 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;
Ini berfungsi untuk saya di Windows, seperti ipconfig /all
perintah sistem Windows.
di bawah linux menggunakan iptables Anda dapat masuk ke file setiap permintaan ke server web dengan alamat mac dan ip. dari pencarian php item terakhir dengan alamat ip dan dapatkan alamat mac.
Seperti yang dinyatakan, ingatlah bahwa alamat mac berasal dari router terakhir yang dilacak.
Anda dapat melakukannya dengan mudah menggunakan openWRT. Jika Anda menggunakan portal tawanan, Anda dapat menggabungkan php dan openWRT dan membuat hubungan antara IP dan mac.
Anda dapat menulis kode PHP sederhana menggunakan:
$localIP = getHostByName(getHostName());
Nanti, dengan menggunakan openWRT yang bisa Anda buka /tmp/dhcp.leases
, Anda akan mendapatkan sesuatu dengan formulir:
e4:a7:a0:29:xx:xx 10.239.3.XXX DESKTOP-XXX
Di sana, Anda memiliki mac, alamat IP, dan nama host.