ฉันจะรับ MAC และที่อยู่ IP ของไคลเอนต์ที่เชื่อมต่อใน PHP ได้อย่างไร


136

ฉันจำเป็นต้องรู้ MAC และที่อยู่ IP ของไคลเอ็นต์การเชื่อมต่อฉันจะทำสิ่งนี้ใน PHP ได้อย่างไร


ที่อยู่ IP ของอะไร ของลูกค้าที่เชื่อมต่อ?
Palantir

1
ที่อยู่ของเซิร์ฟเวอร์หรือของผู้เข้าชม?
KiNgMaR

13
คุณต้องการที่อยู่ MAC สำหรับวัตถุประสงค์อะไร คุณทราบหรือไม่ว่าผู้ใช้สามารถเปลี่ยนแปลงได้?
มาร์ควิสแห่ง Lorne

@EJP ฉันมีกรณีการใช้งานสำหรับที่อยู่ MAC ฉันต้องการที่จะให้บริการข้อมูลที่แตกต่างกันขึ้นอยู่กับอุปกรณ์ที่ร้องขอหน้าเว็บ มีวิธีอื่นในการรับข้อมูลเฉพาะของอุปกรณ์ที่ร้องขอหน้าหรือไม่
Dante

คำตอบ:


186

เซิร์ฟเวอร์ IP

คุณสามารถรับที่อยู่ IP ของเซิร์ฟเวอร์$_SERVER['SERVER_ADDR']ได้

ที่อยู่ MAC ของเซิร์ฟเวอร์

สำหรับที่อยู่ MAC คุณสามารถแยกวิเคราะห์ผลลัพธ์netstat -ieใน Linux หรือipconfig /allใน Windows

ที่อยู่ IP ของลูกค้า

คุณสามารถรับ IP ของไคลเอ็นต์ได้ $_SERVER['REMOTE_ADDR']

ที่อยู่ MAC ของลูกค้า

ที่อยู่ MAC ของลูกค้าจะไม่สามารถใช้ได้ยกเว้นในกรณีพิเศษ: หากลูกค้าอยู่ในกลุ่มอีเธอร์เน็ตเดียวกันกับเซิร์ฟเวอร์

ดังนั้นหากคุณกำลังสร้างระบบที่ใช้ LAN บางประเภทและลูกค้าของคุณอยู่ในเซ็กเมนต์อีเธอร์เน็ตเดียวกันคุณก็จะได้รับที่อยู่ MAC โดยการแยกวิเคราะห์ผลลัพธ์ของarp -n (linux) หรือarp -a(windows)

แก้ไข : คุณถามในความคิดเห็นวิธีรับผลลัพธ์ของคำสั่งภายนอก - วิธีหนึ่งคือใช้ backticks เช่น

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

แต่ถ้าลูกค้าไม่ได้อยู่ใน LAN?

ดีคุณโชคดีนอกเสียจากว่าคุณจะมีอาสาสมัครลูกค้าที่ให้ข้อมูลและส่งผ่านวิธีอื่น


2
วิธีการรับเอาท์พุทของ arp -a โดยใช้ PHP?
Neveen

1
@paulDixon สวัสดีนี่เป็นบทความเก่าและฉันสงสัยว่ามีวิธีใหม่ในการรับที่อยู่ Mac หรือไม่
jcho360

@ jcho360 ยังไม่สามารถรับที่อยู่ MAC ของลูกค้าได้ ฉันไม่คาดหวังว่าจะเห็นมันเกิดขึ้นเพราะที่อยู่ MAC ไม่มีค่าการสื่อสารดังนั้นจะไม่ถูกสงวนไว้ในส่วนหัวคำขอ het
Bearwulf

@Bearwulf ขอบคุณมากสำหรับการตอบกลับนั่นคือสิ่งที่ฉันคิดว่ามีวิธีการระบุคอมพิวเตอร์ที่ไม่ซ้ำกันที่เชื่อมต่อกับเว็บไซต์หรือไม่
jcho360

6
@ jcho360 โดยส่วนตัวฉันจะใช้การรวมกันของที่อยู่ IP + ขอข้อมูลและทำการแฮชของมันตัวอย่างเช่น md5 ($ _ SERVER ['REMOTE_ADDR']. $ _SERVER ['HTTP_USER_AGENT']); แน่นอนว่ามันไม่ได้เป็นกระสุน แต่เป็นการเริ่มต้น อีกวิธีที่ง่ายและปลอดภัยกว่าคือการตั้งค่าคุกกี้ด้วยแฮชที่ไม่ซ้ำใคร เมื่อใช้คุกกี้นั้นทุกครั้งคุณจะแน่ใจว่าผู้ใช้รายใดกำลังเชื่อมต่อกับเว็บไซต์ของคุณ
Bearwulf

24

ที่อยู่ MAC ของไคลเอนต์ (ในแง่ของคอมพิวเตอร์ที่ออกคำขอ HTTP) จะถูกเขียนทับโดยเราเตอร์ทุกเครื่องระหว่างไคลเอนต์และเซิร์ฟเวอร์

IP $_SERVER['REMOTE_ADDR']ไคลเอนต์ให้บริการสิ่งอำนวยความสะดวกเพื่อสคริปต์ใน ในบางสถานการณ์โดยเฉพาะอย่างยิ่งหากเว็บเซิร์ฟเวอร์ของคุณอยู่หลังพร็อกซี (เช่นแคชพร็อกซี) $_SERVER['REMOTE ADDR']จะส่งคืน IP ของพร็อกซีและจะมีค่าเพิ่มเติมบ่อยครั้ง$_SERVER['HTTP_X_FORWARDED_FOR']ซึ่งมี IP ของไคลเอนต์คำขอดั้งเดิม

บางครั้งโดยเฉพาะอย่างยิ่งเมื่อคุณจัดการกับพร็อกซีไม่ระบุชื่อที่คุณไม่ได้ควบคุมพร็อกซีจะไม่ส่งคืนที่อยู่ IP จริงและสิ่งที่คุณหวังได้คือที่อยู่ IP ของพร็อกซี


9

ฉันไม่คิดว่าคุณจะได้รับที่อยู่ MAC ใน PHP แต่คุณสามารถรับ IP จาก$_SERVER['REMOTE_ADDR']ตัวแปรได้


คุณจะได้รับที่อยู่ MAC ที่ฉันคิดว่า :)
Jitesh Sojitra

ที่อยู่ mac จะปรากฏเฉพาะเครือข่ายท้องถิ่นเท่านั้นคุณสามารถเข้าถึงที่อยู่ mac ของอุปกรณ์ใด ๆ ที่อยู่นอกเครือข่ายท้องถิ่นตัวอย่างเช่นที่อยู่ mac ของคุณจะถูกจัดเก็บและมองเห็นได้ในเราเตอร์ไร้สายในพื้นที่ของคุณและภายนอกอุปกรณ์ทั้งหมดในเครือข่าย ใช้และจะสื่อสารกับที่อยู่ IP เดียวกันซึ่งเราเตอร์จะแปลกลับไปเป็นที่อยู่ Mac และจะส่งภายใน
Dheeraj Thedijje

7

สำหรับเซิร์ฟเวอร์ windows ฉันคิดว่าคุณสามารถใช้สิ่งนี้:

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

2
<? php echo exec ('getmac'); ?> ใช้ได้กับ LAN เท่านั้น แต่อันนี้แสดงที่อยู่ mac ทั้งหมด <php system ('getmac'); ?>
Giorgi Gogitidze

และ windows10 ด้วย นอกจากนี้คุณไม่ต้องใช้execเพียง `echogetmac
SaidbakR

6

สิ่งที่คุณต้องทำคือใส่ 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 เป็น daemon ที่ทำงานภายใต้ผู้ใช้ www-data จึงสามารถเรียกใช้คำสั่งนี้ได้

ดังนั้นหากคุณใช้สคริปต์ PHP เช่น:

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

คุณจะได้ผลลัพธ์ของarp -anคำสั่งlinux


6
นั่นจะให้ที่อยู่ MAC ของอุปกรณ์ในเครือข่ายท้องถิ่นของคุณเท่านั้น
duskwuff -inactive-

1
การเปลี่ยนกลุ่มของarpไบนารีนั้นซ้ำซ้อนwww-dataยังคงมีสิทธิ์ดำเนินการจากotherumode
deed02392

2

ใช้คลาสนี้ (https://github.com/BlakeGardner/php-mac-address)

นี่คือคลาส PHP สำหรับการจัดการที่อยู่ MAC บนระบบปฏิบัติการ Unix, Linux และ Mac OS X มันถูกเขียนขึ้นเพื่อช่วยในการปลอมแปลงสำหรับการตรวจสอบความปลอดภัยไร้สายเป็นหลัก


1

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

0

คุณสามารถใช้วิธีแก้ไขปัญหาต่อไปนี้เพื่อแก้ไขปัญหาของคุณ:

$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

เราสามารถรับที่อยู่ MAC ใน Ubuntu ได้ด้วยวิธีนี้ใน php

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

0

การรับที่อยู่ MAC โดยใช้ PHP: (ทดสอบใน 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"
}

0

การรับที่อยู่ Mac อาจไม่ใช่วิธีที่ดีที่สุดในการตรวจสอบเครื่องของลูกค้าผ่านทางอินเทอร์เน็ต พิจารณาใช้โทเค็นแทนซึ่งจะถูกเก็บไว้ในเบราว์เซอร์ของลูกค้าโดยเข้าสู่ระบบของผู้ดูแลระบบ

ดังนั้นไคลเอ็นต์สามารถมีโทเค็นนี้ได้ก็ต่อเมื่อผู้ดูแลระบบมอบให้แก่พวกเขาผ่านเบราว์เซอร์ของพวกเขา หากโทเค็นไม่อยู่หรือไม่ถูกต้องเครื่องของลูกค้าจะไม่ถูกต้อง


-1

คุณสามารถรับที่อยู่MACหรือ ที่อยู่ทางกายภาพ โดยใช้รหัสนี้

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

ฉันใช้ระเบิดหลายครั้งเพราะshell_exec ("ipconfig / all")คืนรายละเอียดที่สมบูรณ์ของเครือข่ายทั้งหมด ดังนั้นคุณต้องแยกทีละคน เมื่อคุณเรียกใช้รหัสนี้คุณจะได้รับที่อยู่ MAC
ของคุณ00 - ## - ## - CV-12 // นี่คือที่อยู่ปลอมสำหรับแสดงเท่านั้น


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

สิ่งนี้ใช้ได้กับฉันใน Windows เช่นเดียวกับipconfig /allคำสั่งระบบของ Windows


5
หากคำตอบนี้สอนอะไรคุณก็หวังว่าจะไม่คัดลอก / วางรหัสที่คุณไม่เข้าใจ มันไม่ได้ทำในสิ่งที่ OP ถาม
tripleee

-2

ภายใต้ linux โดยใช้ iptables คุณสามารถเข้าสู่ไฟล์แต่ละคำขอไปยังเว็บเซิร์ฟเวอร์พร้อมที่อยู่ mac และ ip จากการค้นหารายการสุดท้ายด้วย php ที่อยู่ ip และรับที่อยู่ mac

ตามที่ระบุไว้โปรดจำไว้ว่าที่อยู่ mac มาจากเราเตอร์ล่าสุดในการติดตาม


-4

คุณสามารถทำได้อย่างง่ายดายโดยใช้ openWRT หากคุณใช้พอร์ทัลแบบ Captive คุณสามารถผสม 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 และชื่อโฮสต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.