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?
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?
Câu trả lời:
Bạn có thể lấy địa chỉ IP của máy chủ từ $_SERVER['SERVER_ADDR']
.
Đối với địa chỉ MAC, bạn có thể phân tích cú pháp đầu ra của netstat -ie
Linux hoặc ipconfig /all
trong Windows.
Bạn có thể lấy IP của khách hàng từ $_SERVER['REMOTE_ADDR']
Đị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];
}
}
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.
Đị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.
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.
Đố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');
?>
exec
chỉ `echogetmac
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 -an
lệnh linux .
arp
nhị phân là dư thừa, www-data
vẫn có quyền thực thi từ other
umode.
Sử dụng lớp này (https://github.com/BlakeGardner/php-mac-address)
Đây là lớp PHP để thao tác địa chỉ MAC trên các hệ điều hành Unix, Linux và Mac OS X. nó chủ yếu được viết để giúp giả mạo cho kiểm toán bảo mật không dây.
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);
?>
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;
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"
}
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ệ.
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ị.
// 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 /all
lệnh hệ thống Windows.
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ủ.