C++-php能获取客户端的MAC地址吗

需求定制 需求定制 主题:1050 回复:2283

C++-php能获取客户端的MAC地址吗

夜无邪 发布于 2017-05-09 字数 330 浏览 1166 回复 9

单位的网站在百度做推广了,但是发现有很多竞争对手恶意点击,发现很快百度的钱就烧没了;
然后再网上找了一个防恶意软件,就在网站里边加了一段js代码,然后会对一些恶意点击的用户有一些提示和攻击;效果好了很多
他们说不但能记录访问者的ip还能记录他们的MAC地址,
这个是怎么实现的哇?php能获取客户端的MAC地址吗?请高手指教

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(9

虐人心 2017-10-23 9 楼

PHP本身不提供,可以包一些平台相关的命令,windows下用ipconfig:

 $text = ifconfig;
preg_match('/([0-9a-f]{2}:){5}ww/i', $text, $mac);
$mac = $mac[0];

瑾兮 2017-10-22 8 楼

linux下获取mac地址的代码:

 // Get the arp executable path
$location = which arp;
// Execute the arp command and store the output in $arpTable
$arpTable = $location;
// Split the output so every line is an entry of the $arpSplitted array
$arpSplitted = split("n",$arpTable);
// Get the remote ip address (the ip address of the client, the browser)
$remoteIp = $GLOBALS['REMOTE_ADDR'];
// Cicle the array to find the match with the remote ip address
foreach ($arpSplitted as $value) {
// Split every arp line, this is done in case the format of the arp
// command output is a bit different than expected
$valueSplitted = split(" ",$value);
foreach ($valueSplitted as $spLine) {
if (preg_match("/$remoteIp/",$spLine)) {
$ipFound = true;
}
// The ip address has been found, now rescan all the string
// to get the mac address
if ($ipFound) {
// Rescan all the string, in case the mac address, in the string
// returned by arp, comes before the ip address
// (you know, Murphy's laws)
reset($valueSplitted);
foreach ($valueSplitted as $spLine) {
if (preg_match("/[0-9a-f][0-9a-f][:-]".
"[0-9a-f][0-9a-f][:-]".
"[0-9a-f][0-9a-f][:-]".
"[0-9a-f][0-9a-f][:-]".
"[0-9a-f][0-9a-f][:-]".
"[0-9a-f][0-9a-f]/i",$spLine)) {
return $spLine;
}
}
}
$ipFound = false;
}
}
return false;
}

瑾兮 2017-09-18 7 楼

<?php

class GetMacAddr{
var $return_array = array(); // 返回带有MAC地址的字串数组
var $mac_addr;
function GetMacAddr($os_type){
switch ( strtolower($os_type) ){
case "linux":
$this->forLinux();
break;
case "solaris":
break;
case "unix":
break;
case "aix":
break;
default:
$this->forWindows();
break;
}
$temp_array = array();
foreach ( $this->return_array as $value ){
if (
preg_match("/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i",$value,
$temp_array ) ){
$this->mac_addr = $temp_array[0];
break;
}
}
unset($temp_array);
return $this->mac_addr;
}
function forWindows(){
@exec("ipconfig /all", $this->return_array);
if ( $this->return_array )
return $this->return_array;
else{
$ipconfig = $_SERVER["WINDIR"]."system32ipconfig.exe";
if ( is_file($ipconfig) )
@exec($ipconfig." /all", $this->return_array);
else
@exec($_SERVER["WINDIR"]."systemipconfig.exe /all", $this->return_array);
return $this->return_array;
}
}
function forLinux(){
@exec("ifconfig -a", $this->return_array);
return $this->return_array;
}
}
//方法使用
//$mac = new GetMacAddr(PHP_OS);
//echo $mac->mac_addr;
?>

浮生未歇 2017-08-30 6 楼

不对啊,我记得以前讨论过这个问题,还写成一个类了,exec可以获取远端mac的,你想想,你用window可不可以获取远程mac?而php可以调用cmd,是可以实现的,试过了

虐人心 2017-07-25 5 楼

可以通过调用arp,即地址解析协议,然后通过$_SERVER['REMOTE_ADDR']获取客户端IP地址得到其物理地址,代码如下:

 $ipAddress=$_SERVER['REMOTE_ADDR'];
$macAddr=false;

$arp=arp -a $ipAddress;
$lines=explode("n", $arp);

foreach($lines as $line)
{
$cols=preg_split('/s+/', trim($line));
if ($col[0]==$ipAddress)
{
$macAddr=$col[1];
}
}

echo $macAddr;

晚风撩人 2017-07-14 4 楼

PHP是获取客户端的所有信息都是依赖于HTTP协议头信息或者是由客户端主动传送信息,否则是无法自动获取得到。但是由于安全和权限问题HTTP是不会传送客户端的MAC地址,那么剩下的就只有一种方式,那就是客户端自己传送,而对于前端来说JavaScript是无法获取到用户机器的MAC地址的。

对于IE来说可以通过ActiveX来获取,但是对于用户来说是很不友好的,需要用户允许它获取MAC地址信息。或者是Java的Applet也可以获取,但是同样需要用户浏览器允许Applet运行,但目前大多数都禁止了,所以也是不太先靠谱的。除此两个方法之外,别无它法。而对于ARP来说,现大目前很多防火墙软件都屏蔽了,所以也不可行。

以下是我整理的一个ActiveX获取网卡Mac的一小段代码,可以参考一下:

<html><head><title>wmi scripting html</title>
<meta http-equiv=content-type content="text/html; charset=gb2312">
<script language=JScript event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for=foo>
document.forms[0].txtMACAddr.value=unescape(MACAddr);
document.forms[0].txtIPAddr.value=unescape(IPAddr);
document.forms[0].txtDNSName.value=unescape(sDNSName);

</script>

<script language=jscript event=OnObjectReady(objObject,objAsyncContext) for=foo>
if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
{
if(objObject.MACAddress != null && objObject.MACAddress != "undefined")
MACAddr = objObject.MACAddress;
if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined")
IPAddr = objObject.IPAddress(0);
if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined")
sDNSName = objObject.DNSHostName;
}
</script>

<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<object id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></object>
<object id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></object>
<script language=jscript>
var service = locator.ConnectServer();
var MACAddr ;
var IPAddr ;
var DomainAddr;
var sDNSName;
service.Security_.ImpersonationLevel=3;
service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
</script>

<form id="formfoo" name="formbar" action="#" method="post"><input value="" name="txtmacaddr"> <input value="" name="txtipaddr">

<input value="zhupan" name="txtdnsname">
<input type="submit" value="send"></form>
</body>
</html>

清晨说ぺ晚安 2017-06-30 3 楼

如果你这项目是真的必须取mac地址的话,只能搞个active 这玩意只和IE友好,否则想取mac那肯定是不现实的。

晚风撩人 2017-05-22 2 楼

通过php的exec执行命令应该可以获取到远程主机的mac,在windows服务器下使用Ping命令ping一下远程主机的IP地址,然后用arp -a 或者是 arp -g 就得到一个IP地址和Mac地址的对应表,在linux服务器下使用"ping {$ip} -c 2 && arp -a" 就能获取客户端的mac地址,不过经过测试我发现,在使用了路由器的情况下就没法获取内网电脑的mac地址了,目前这种情况暂时没有找到办法

想挽留 2017-05-15 1 楼

用js获取MAC地址,存放到cookie中,然后php通过获取cookie得到MAC地址。

或者使用ajax提交到服务器,保存在session中,方便用到的程序获取。