Làm cách nào tôi có thể lấy MAC và địa chỉ IP của máy khách được kết nối trong PHP?


136

Tôi cần biết MAC và địa chỉ IP của các máy khách kết nối, làm thế nào tôi có thể làm điều này trong PHP?


Địa chỉ IP của cái gì? Của khách hàng được kết nối?
Palantir

1
Địa chỉ của máy chủ hoặc của khách truy cập?
KiNgMaR

13
Với mục đích gì bạn muốn địa chỉ MAC? Bạn có biết nó có thể được thay đổi bởi người dùng?
Hầu tước Lorne

@EJP Tôi có một trường hợp sử dụng cho địa chỉ MAC. Tôi muốn cung cấp thông tin khác nhau dựa trên thiết bị đang yêu cầu trang web. Có cách nào khác để lấy thông tin duy nhất của thiết bị yêu cầu trang không?
Dante

Câu trả lời:


186

IP máy chủ

Bạn có thể lấy địa chỉ IP của máy chủ từ $_SERVER['SERVER_ADDR'].

Địa chỉ MAC của máy chủ

Đối với địa chỉ MAC, bạn có thể phân tích cú pháp đầu ra của netstat -ieLinux hoặc ipconfig /alltrong Windows.

Địa chỉ IP của khách hàng

Bạn có thể lấy IP của khách hàng từ $_SERVER['REMOTE_ADDR']

Địa chỉ MAC của khách hàng

Địa chỉ MAC của máy khách sẽ không có sẵn cho bạn ngoại trừ trong một trường hợp đặc biệt: nếu máy khách nằm trên cùng phân khúc ethernet với máy chủ.

Vì vậy, nếu bạn đang xây dựng một số loại hệ thống dựa trên mạng LAN và các máy khách của bạn nằm trên cùng một phân đoạn ethernet, thì bạn có thể lấy địa chỉ MAC bằng cách phân tích đầu ra của arp -n(linux) hoặc arp -a(windows).

Chỉnh sửa : bạn hỏi trong các nhận xét làm thế nào để có được đầu ra của một lệnh bên ngoài - một cách là sử dụng backticks, ví dụ:

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

Nhưng nếu máy khách không có mạng LAN thì sao?

Chà, bạn không gặp may trừ khi bạn có thể nhờ khách hàng tình nguyện cung cấp thông tin đó và truyền qua các phương tiện khác.


2
Làm thế nào để có được đầu ra của arp -a bằng cách sử dụng php ??
Neveen

1
@paulDixon xin chào, đây là một bài viết cũ và tôi tự hỏi liệu có một cách mới để lấy Địa chỉ Mac không?
jcho360

@ jcho360 Vẫn không thể lấy địa chỉ MAC của khách hàng. Tôi không mong đợi để xem điều đó xảy ra dù sao vì địa chỉ MAC không có giá trị liên lạc và do đó sẽ không được lưu trong tiêu đề yêu cầu het.
Bearwulf

@Bearwulf cảm ơn bạn rất nhiều vì đã trả lời lại, đó là những gì tôi nghĩ, có cách nào để xác định các máy tính duy nhất được kết nối với một trang web không?
jcho360

6
@ jcho360 Cá nhân tôi sẽ sử dụng kết hợp địa chỉ IP + Yêu cầu thông tin và tạo hàm băm của nó, ví dụ md5 ($ _ SERVER ['REMOTE_ADDR']. $ _SERVER ['HTTP_USER_AGENT']);. Nó chắc chắn không phải là chống đạn nhưng là một khởi đầu. Một cách khác dễ dàng và an toàn hơn là đặt cookie với hàm băm duy nhất. Khi sử dụng cookie đó mọi lúc, bạn chắc chắn người dùng nào đang kết nối với trang web của mình.
Bearwulf

24

Địa chỉ MAC của máy khách (theo nghĩa là máy tính đưa ra yêu cầu HTTP) được ghi đè bởi mọi bộ định tuyến giữa máy khách và máy chủ.

IP khách hàng được cung cấp thuận tiện cho tập lệnh trong $_SERVER['REMOTE_ADDR']. Trong một số trường hợp, đặc biệt nếu máy chủ web của bạn đứng sau proxy (tức là proxy lưu trữ) $_SERVER['REMOTE ADDR']sẽ trả lại IP của proxy và thường sẽ có một giá trị bổ sung $_SERVER['HTTP_X_FORWARDED_FOR']chứa IP của ứng dụng khách yêu cầu ban đầu.

Đôi khi, đặc biệt là khi bạn đang xử lý một proxy ẩn danh mà bạn không kiểm soát, proxy sẽ không trả lại địa chỉ IP thực và tất cả những gì bạn có thể hy vọng là địa chỉ IP của proxy.


9

Tôi không nghĩ bạn có thể lấy địa chỉ MAC trong PHP, nhưng bạn có thể lấy IP từ $_SERVER['REMOTE_ADDR']biến.


Bạn có thể lấy địa chỉ mac, tôi nghĩ vậy :)
Jitesh Sojitra 17/05/2016

Địa chỉ mac chỉ hiển thị với các mạng cục bộ, bạn có thể truy cập địa chỉ mac của bất kỳ thiết bị nào ngoài mạng cục bộ của nó, ví dụ địa chỉ mac của bạn sẽ được lưu trữ và hiển thị trong bộ định tuyến wifi cục bộ của bạn và bên ngoài nó, tất cả các thiết bị trong mạng của bạn sẽ đang sử dụng và sẽ được liên lạc với cùng một địa chỉ IP, bộ định tuyến nào sẽ dịch lại thành địa chỉ mac và sẽ gửi nó trong nội bộ.
Dheeraj Thedijje

7

Đối với máy chủ windows tôi nghĩ bạn có thể sử dụng cái này:

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

2
<? php echo exec ('getmac'); ?> nó chỉ hoạt động trên mạng LAN, nhưng cái này hiển thị tất cả địa chỉ mac <hệ thống php ('getmac'); ?>
Giorgi Gogitidze

Và windows10 cũng vậy. Ngoài ra, bạn không được sử dụng execchỉ `echogetmac
SaidbakR

6

Tất cả bạn cần làm là đưa arp vào nhóm khác nhau.

Mặc định:

-rwxr-xr-x 1 root root 48K 2008-11-11 18:11 /usr/sbin/arp*

Với lệnh:

sudo chown root:www-data /usr/sbin/arp

bạn sẽ nhận được:

-rwxr-xr-x 1 root www-data 48K 2008-11-11 18:11 /usr/sbin/arp*

Và vì apache là một daemon chạy dưới dữ liệu www của người dùng, giờ đây nó có thể thực thi lệnh này.

Vì vậy, nếu bây giờ bạn sử dụng tập lệnh PHP, vd:

<?php
$mac = system('arp -an');
echo $mac;
?>

bạn sẽ nhận được đầu ra của arp -anlệnh linux .


6
Điều đó sẽ chỉ cung cấp cho bạn địa chỉ MAC của các thiết bị trên mạng cục bộ của bạn.
duskwuff -inactive-

1
Thay đổi nhóm của arpnhị phân là dư thừa, www-datavẫn có quyền thực thi từ otherumode.
deed02392


1

Trong windows, nếu người dùng đang sử dụng tập lệnh của bạn cục bộ, nó sẽ rất đơn giản:

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

Bạn có thể sử dụng giải pháp sau để giải quyết vấn đề của mình:

$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

Chúng ta có thể lấy địa chỉ MAC trong Ubuntu bằng cách này bằng php

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

0

Lấy địa chỉ MAC bằng PHP: (Đã thử nghiệm trong Ubuntu 18.04) - Cập nhật 2020

Đây là Mã:

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

Đầu ra:

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

Có lẽ lấy địa chỉ Mac không phải là cách tiếp cận tốt nhất để xác minh máy của khách hàng qua internet. Xem xét sử dụng mã thông báo thay vì được lưu trữ trong trình duyệt của khách hàng bằng thông tin đăng nhập của quản trị viên.

Do đó, khách hàng chỉ có thể có mã thông báo này nếu quản trị viên cấp cho họ thông qua trình duyệt của họ. Nếu mã thông báo không có mặt hoặc hợp lệ thì máy của khách hàng không hợp lệ.


-1

Bạn có thể nhận Địa chỉ MAC hoặc Địa chỉ thực bằng mã này

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

Tôi đã sử dụng phát nổ nhiều lần vì shell_exec ("ipconfig / all") trả về chi tiết đầy đủ của tất cả các mạng. vì vậy bạn phải chia từng cái một khi bạn chạy mã này thì bạn sẽ nhận được
của bạn Địa chỉ MAC 00 - ## - ## - CV-12 // đây là địa chỉ giả để chỉ hiển thị.


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

Điều này làm việc cho tôi trên Windows, cũng như ipconfig /alllệnh hệ thống Windows.


5
Nếu câu trả lời này dạy cho bạn bất cứ điều gì, hy vọng nó sẽ không sao chép / dán mã mà bạn không hiểu. Nó không làm những gì OP yêu cầu.
tripleee

-2

trong linux bằng iptables, bạn có thể đăng nhập vào một tệp mỗi yêu cầu đến máy chủ web với địa chỉ mac và ip. từ tìm kiếm php mục cuối cùng với địa chỉ IP và nhận địa chỉ mac.

Như đã nói, hãy nhớ rằng địa chỉ mac là từ bộ định tuyến cuối cùng trên dấu vết.


-4

Bạn có thể làm điều này một cách dễ dàng bằng openWRT. Nếu bạn sử dụng cổng bị khóa, bạn có thể trộn php và openWRT và tạo mối quan hệ giữa IP và mac.

Bạn có thể viết một mã PHP đơn giản bằng cách sử dụng:

 $localIP = getHostByName(getHostName()); 

Sau đó, bằng cách sử dụng openWRT bạn có thể truy cập /tmp/dhcp.leases, bạn sẽ nhận được một cái gì đó với biểu mẫu:

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

Ở đó, bạn có mac, địa chỉ IP và tên máy chủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.