ฉันจำเป็นต้องรู้ MAC และที่อยู่ IP ของไคลเอ็นต์การเชื่อมต่อฉันจะทำสิ่งนี้ใน PHP ได้อย่างไร
ฉันจำเป็นต้องรู้ MAC และที่อยู่ IP ของไคลเอ็นต์การเชื่อมต่อฉันจะทำสิ่งนี้ใน PHP ได้อย่างไร
คำตอบ:
คุณสามารถรับที่อยู่ IP ของเซิร์ฟเวอร์$_SERVER['SERVER_ADDR']
ได้
สำหรับที่อยู่ MAC คุณสามารถแยกวิเคราะห์ผลลัพธ์netstat -ie
ใน Linux หรือipconfig /all
ใน Windows
คุณสามารถรับ IP ของไคลเอ็นต์ได้ $_SERVER['REMOTE_ADDR']
ที่อยู่ 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];
}
}
ดีคุณโชคดีนอกเสียจากว่าคุณจะมีอาสาสมัครลูกค้าที่ให้ข้อมูลและส่งผ่านวิธีอื่น
ที่อยู่ MAC ของไคลเอนต์ (ในแง่ของคอมพิวเตอร์ที่ออกคำขอ HTTP) จะถูกเขียนทับโดยเราเตอร์ทุกเครื่องระหว่างไคลเอนต์และเซิร์ฟเวอร์
IP $_SERVER['REMOTE_ADDR']
ไคลเอนต์ให้บริการสิ่งอำนวยความสะดวกเพื่อสคริปต์ใน ในบางสถานการณ์โดยเฉพาะอย่างยิ่งหากเว็บเซิร์ฟเวอร์ของคุณอยู่หลังพร็อกซี (เช่นแคชพร็อกซี) $_SERVER['REMOTE ADDR']
จะส่งคืน IP ของพร็อกซีและจะมีค่าเพิ่มเติมบ่อยครั้ง$_SERVER['HTTP_X_FORWARDED_FOR']
ซึ่งมี IP ของไคลเอนต์คำขอดั้งเดิม
บางครั้งโดยเฉพาะอย่างยิ่งเมื่อคุณจัดการกับพร็อกซีไม่ระบุชื่อที่คุณไม่ได้ควบคุมพร็อกซีจะไม่ส่งคืนที่อยู่ IP จริงและสิ่งที่คุณหวังได้คือที่อยู่ IP ของพร็อกซี
ฉันไม่คิดว่าคุณจะได้รับที่อยู่ MAC ใน PHP แต่คุณสามารถรับ IP จาก$_SERVER['REMOTE_ADDR']
ตัวแปรได้
สำหรับเซิร์ฟเวอร์ windows ฉันคิดว่าคุณสามารถใช้สิ่งนี้:
<?php
echo exec('getmac');
?>
exec
เพียง `echogetmac
สิ่งที่คุณต้องทำคือใส่ 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
arp
ไบนารีนั้นซ้ำซ้อนwww-data
ยังคงมีสิทธิ์ดำเนินการจากother
umode
ใช้คลาสนี้ (https://github.com/BlakeGardner/php-mac-address)
นี่คือคลาส PHP สำหรับการจัดการที่อยู่ MAC บนระบบปฏิบัติการ Unix, Linux และ Mac OS X มันถูกเขียนขึ้นเพื่อช่วยในการปลอมแปลงสำหรับการตรวจสอบความปลอดภัยไร้สายเป็นหลัก
ใน 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);
?>
คุณสามารถใช้วิธีแก้ไขปัญหาต่อไปนี้เพื่อแก้ไขปัญหาของคุณ:
$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;
เราสามารถรับที่อยู่ MAC ใน Ubuntu ได้ด้วยวิธีนี้ใน php
$ipconfig = shell_exec ("ifconfig -a | grep -Po 'HWaddr \K.*$'");
// display mac address
echo $ipconfig;
การรับที่อยู่ 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"
}
การรับที่อยู่ Mac อาจไม่ใช่วิธีที่ดีที่สุดในการตรวจสอบเครื่องของลูกค้าผ่านทางอินเทอร์เน็ต พิจารณาใช้โทเค็นแทนซึ่งจะถูกเก็บไว้ในเบราว์เซอร์ของลูกค้าโดยเข้าสู่ระบบของผู้ดูแลระบบ
ดังนั้นไคลเอ็นต์สามารถมีโทเค็นนี้ได้ก็ต่อเมื่อผู้ดูแลระบบมอบให้แก่พวกเขาผ่านเบราว์เซอร์ของพวกเขา หากโทเค็นไม่อยู่หรือไม่ถูกต้องเครื่องของลูกค้าจะไม่ถูกต้อง
คุณสามารถรับที่อยู่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 // นี่คือที่อยู่ปลอมสำหรับแสดงเท่านั้น
// 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
ภายใต้ linux โดยใช้ iptables คุณสามารถเข้าสู่ไฟล์แต่ละคำขอไปยังเว็บเซิร์ฟเวอร์พร้อมที่อยู่ mac และ ip จากการค้นหารายการสุดท้ายด้วย php ที่อยู่ ip และรับที่อยู่ mac
ตามที่ระบุไว้โปรดจำไว้ว่าที่อยู่ mac มาจากเราเตอร์ล่าสุดในการติดตาม
คุณสามารถทำได้อย่างง่ายดายโดยใช้ 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 และชื่อโฮสต์