PHP에서 연결된 클라이언트의 MAC 및 IP 주소를 어떻게 얻을 수 있습니까?


136

연결 클라이언트의 MAC 및 IP 주소를 알아야합니다. PHP에서 어떻게해야합니까?


무엇의 IP 주소? 연결된 클라이언트 중?
Palantir

1
서버 또는 방문자의 주소?
KiNgMaR

13
어떤 목적으로 MAC 주소를 원하십니까? 사용자가 변경할 수 있다는 것을 알고 있습니까?
Lorne의 후작

@ EJP MAC 주소에 대한 사용 사례가 있습니다. 웹 페이지를 요청하는 장치에 따라 다른 정보를 제공하고 싶습니다. 페이지를 요청하는 장치의 고유 정보를 얻는 다른 방법이 있습니까?
단테

답변:


186

서버 IP

에서 서버 IP 주소를 얻을 수 있습니다 $_SERVER['SERVER_ADDR'].

서버 MAC 주소

MAC 주소의 경우 netstat -ieLinux 또는 ipconfig /allWindows 의 출력을 구문 분석 할 수 있습니다.

클라이언트 IP 주소

당신은 클라이언트 IP를 얻을 수 있습니다 $_SERVER['REMOTE_ADDR']

클라이언트 MAC 주소

클라이언트가 서버와 동일한 이더넷 세그먼트에있는 경우 특별한 상황을 제외하고는 클라이언트 MAC 주소를 사용할 수 없습니다 .

따라서 LAN 기반 시스템을 구축하고 클라이언트 동일한 이더넷 세그먼트에있는 경우 arp -n(linux) 또는 arp -a(windows) 의 출력을 구문 분석하여 MAC 주소를 얻을 수 있습니다.

편집 : 외부 명령의 출력을 얻는 방법을 의견에 묻습니다-한 가지 방법은 백틱을 사용하는 것입니다.

$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
PHP를 사용하여 arp -a의 출력을 얻는 방법 ??
Neveen

1
@ paulDixon 안녕하세요. 이것은 오래된 게시물이며 Mac 주소를 얻는 새로운 방법이 있는지 궁금합니다.
jcho360 2016 년

@ jcho360 여전히 클라이언트의 MAC 주소를 얻을 수 없습니다. MAC 주소에 통신 값이 없으므로 요청 헤더에 보존되지 않기 때문에 어쨌든 발생할 것으로 예상하지 않습니다.
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

PHP로 MAC 주소를 얻을 수 있다고 생각하지 않지만 $_SERVER['REMOTE_ADDR']변수 에서 IP를 얻을 수 있습니다 .


당신은 맥 주소를 얻을 수 있다고 생각합니다 :)
Jitesh Sojitra

mac 주소는 로컬 네트워크에서만 볼 수 있습니다. 로컬 네트워크 외부에서 모든 장치의 mac 주소에 액세스 할 수 있습니다. 예를 들어, mac 주소는 로컬 wifi 라우터에 저장되고 표시됩니다. 동일한 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는 사용자 www-data에서 실행되는 데몬이므로 이제이 명령을 실행할 수 있습니다.

따라서 이제 PHP 스크립트를 사용하는 경우 :

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

당신은 리눅스 arp -an명령 의 출력을 얻을 것이다 .


6
로컬 네트워크에있는 장치의 MAC 주소 만 제공합니다.
duskwuff -inactive-

1
arp바이너리 그룹을 변경하는 것은 불필요하지만 www-data여전히 otherumode 에서 실행 권한이 있습니다 .
deed02392


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

우리는 PHP에서 이런 방식으로 우분투에서 MAC 주소를 얻을 수 있습니다

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

0

PHP를 사용하여 MAC 주소 얻기 : (우분투 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 주소 ## - - ## - CV-12 00 쇼에만 // 이것이 가짜 주소를.


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

이것은 ipconfig /allWindows 시스템 명령 과 마찬가지로 Windows에서도 작동합니다 .


5
이 답변이 당신에게 아무것도 가르쳐주지 않으면, 이해하지 못하는 코드를 복사 / 붙여 넣기하지 않기를 바랍니다. OP가 요청한 내용은 수행하지 않습니다.
tripleee

-2

iptables를 사용하는 Linux에서는 mac 주소와 ip를 사용하여 웹 서버에 각 요청을 파일에 기록 할 수 있습니다. IP 주소와 PHP 조회 마지막 항목에서 맥 주소를 가져옵니다.

언급 한대로 mac 주소는 추적의 마지막 라우터에서 온 것임을 기억하십시오.


-4

openWRT를 사용하면이 작업을 쉽게 수행 할 수 있습니다. 캡 티브 포털을 사용하는 경우 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.