Bagaimana saya bisa mendapatkan MAC dan alamat IP dari klien yang terhubung di PHP?


142

Saya perlu mengetahui MAC dan alamat IP dari klien yang terhubung, bagaimana saya bisa melakukan ini di PHP?


Alamat IP apa? Dari klien yang terhubung?
Palantir

1
Alamat server atau pengunjung?
KiNgMaR

13
Untuk tujuan apa Anda menginginkan alamat MAC? Apakah Anda sadar ini dapat diubah oleh pengguna?
Marquis dari Lorne

@EJP Saya memiliki kasus penggunaan untuk alamat MAC. Saya ingin menyajikan informasi berbeda berdasarkan perangkat yang meminta halaman web. Apakah ada cara lain untuk mendapatkan informasi unik dari perangkat yang meminta laman?
Dante

Jawaban:


196

IP server

Anda bisa mendapatkan alamat IP server dari $_SERVER['SERVER_ADDR'].

Alamat MAC server

Untuk alamat MAC, Anda dapat mengurai keluaran netstat -iedi Linux, atau ipconfig /alldi Windows.

Alamat IP klien

Anda bisa mendapatkan IP klien dari $_SERVER['REMOTE_ADDR']

Alamat MAC klien

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];
   }
}

Tetapi bagaimana jika klien tidak menggunakan LAN?

Nah, Anda kurang beruntung kecuali Anda dapat meminta klien memberikan informasi itu secara sukarela dan mengirimkannya melalui cara lain.


2
Bagaimana cara mendapatkan output arp -a dengan menggunakan php ??
Neveen

1
@paulDixon halo ini adalah posting lama, dan saya bertanya-tanya apakah ada cara baru untuk mendapatkan Alamat Mac?
jcho360

@ jcho360 Masih belum mungkin mendapatkan alamat MAC dari klien. Saya tidak berharap untuk melihatnya terjadi karena alamat MAC tidak memiliki nilai komunikasi sehingga tidak akan disimpan dalam header permintaan het.
Bearwulf

@Bearwulf terima kasih banyak atas balasannya, itulah yang saya pikirkan, apakah ada cara untuk mengidentifikasi komputer unik yang terhubung ke situs?
jcho360

7
@ jcho360 Secara pribadi saya akan menggunakan kombinasi alamat IP + Minta informasi dan membuat hash darinya, misalnya md5 ($ _ SERVER ['REMOTE_ADDR']. $ _SERVER ['HTTP_USER_AGENT']) ;. Ini jelas bukan antipeluru tetapi ini adalah awal. Cara lain yang lebih mudah dan aman adalah mengatur cookie dengan hash unik. Saat menggunakan cookie itu setiap kali Anda yakin pengguna mana yang terhubung ke situs web Anda.
Bearwulf

24

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.


9

Saya tidak berpikir Anda bisa mendapatkan alamat MAC di PHP, tetapi Anda bisa mendapatkan IP dari $_SERVER['REMOTE_ADDR']variabel.


Anda bisa mendapatkan alamat mac, saya pikir :)
Jitesh Sojitra

alamat mac hanya terlihat oleh jaringan lokal, Anda dapat mengakses alamat mac dari perangkat apa pun di luar jaringan lokalnya, misalnya alamat mac Anda akan disimpan dan terlihat di router wifi lokal Anda, dan di luar itu, semua perangkat di jaringan Anda akan menggunakan dan akan dikomunikasikan dengan alamat IP yang sama, router mana yang akan menerjemahkan kembali ke alamat mac dan akan mengirimkannya secara internal.
Dheeraj Thedijje

8

Untuk windows server saya pikir Anda bisa menggunakan ini:

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

2
<? php echo exec ('getmac'); ?> ini hanya bekerja di LAN, tapi yang ini menampilkan semua alamat mac <php system ('getmac'); ?>
Giorgi Gogitidze

Dan windows10 juga. Juga, Anda tidak perlu menggunakan exechanya ʻechogetmac
SaidbakR

6

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 -anperintah linux .


6
Itu hanya akan memberi Anda alamat MAC dari perangkat di jaringan lokal Anda.
senja -tidak aktif-

1
Mengubah grup arpbiner adalah redundan, www-datamasih memiliki izin eksekusi dari otherumode.
akta02392


1

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

0

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;

0

Kita bisa mendapatkan alamat MAC di Ubuntu dengan cara ini di php

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

0

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"
}

0

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.


0

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.


-1

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.


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

Ini berfungsi untuk saya di Windows, seperti ipconfig /allperintah sistem Windows.


5
Jika jawaban ini mengajari Anda sesuatu, semoga tidak menyalin / menempelkan kode yang Anda tidak mengerti. Itu tidak melakukan apa yang diminta OP.
tripleee

-2

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.


-4

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.