有个问题困扰了好久了,如何处理网站访问者的身份呢?IP吗?如果用户改IP呢?后来想到了用户电脑的MAC地址是唯一的,OK想办法拿到用户MAC地址
问题就解决了。但是怎么拿又是个问题,全网上查
了下,发现一个拿自己MAC的方法,但是不是我们要的结果啊,肿么办?DT的问了老师,他说PHP不能获取到MAC地址,当时好伤心啊。后来想想或许大神
是真不知道吧。但是,关荣的遇上了强哥(李强强老师),强哥V5啊!在强哥的课堂是一不小心学到了一个关于操作MAC的函数,太happy了,灵感来
了!arp -a (linux上是直接用arp 就行)
只要用户登录你的网站就会建立通信,然后他的MAC就存到你的arp列表中。在php上使用exec()函数可以执行DOS命令,然后把exec()执行
的结果赋值给一个数组,下图是在DOS上的结果
----------------------------------------------------------------------------------
C:\Documents and Settings\Administrator>arp -a
Interface: 192.168.100.254 --- 0x2
Internet Address Physical Address Type
192.168.100.137 00-00-00-00-00-00 invalid
Interface: 192.168.60.29 --- 0x3
Internet Address Physical Address Type
192.168.60.1 3c-e5-a6-0c-60-bb dynamic
192.168.60.4 00-1f-c6-e9-4c-a3 dynamic
192.168.60.13 00-16-d3-2f-83-55 dynamic
192.168.60.28 00-15-58-7b-72-92 dynamic
192.168.60.100 dc-0e-a1-5f-57-a6 dynamic
192.168.60.179 00-15-58-81-07-4e dynamic
192.168.60.214 00-16-41-17-f0-d1 dynamic
----------------------------------------------------------------------------------
得到这个数组后我们就可以拿到用户的mac了,这里会用到一些字符串处理函数,推荐大家使用explode(),很快就拿到自己想要的数据了,是不是很happy。
在
笔者测试的时候也发现了一些问题,需要继续完善下,这个命令在windows环境下跑的很好,但到linux下就捉襟见肘了,不过这里大体思路完成了,只
要在用户访问网站时,先判断下用户的操作系统然后对应的选择NET类中的方法就解决问题了,话说linux下用awk会比php的字符串操作函数更方便,
期待大家共同完善,和提出新的问题,共同进步!
下面附上源码。
/**
*采集访问者网络信息
*
*/
class Net{
/**
*参数列表
*
*@param string $hostMac 服务器IP配置文件的MAC信息行
*@param string $Vip 客户端IP地址
*@param string $Vmac 客户端MAC地址
*
*/
private $hostMac=array();
static $Vip=NULL;
private $pos;
static $Vmac=NULL;
private $Maclist=array();
/**
*获取服务器的MAC地址
*@param int $Tmpa 支持for循环的临时参数
*@param array $Tmarr 存放列表信息的临时数组
*@return 返回值:服务器的MAC
*/
public function getHostMac(){
@exec("ipconfig/all",$Tmarr);
for($Tmpa;$Tmpa if(eregi("Physical",$Tmarr[$Tmpa])){
$this->hostMac=explode(":",$Tmarr[$Tmpa]);
}
}
return $this->hostMac[1];
}
/**
*获取客户端的IP地址
*@param int $Tmpa 支持for循环的临时参数
*@param array $Tmarr 存放列表信息的临时数组
*@return 返回值:客户端IP
*/
public function getVisitIp() {
if (self::$Vip !== NULL){
return self::$Vip;
}
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$Tmarr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown',$Tmarr);
if(false !== $pos){
unset($Tmarr[$pos]);
}
echo self::$Vip;
die();
}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
self::$Vip = $_SERVER['HTTP_CLIENT_IP'];
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
self::$Vip = $_SERVER['REMOTE_ADDR'];
}
// IP地址合法验证
self::$Vip = (false !== ip2long(self::$Vip)) ? self::$Vip : '0.0.0.0';
return self::$Vip;
}
/**
*获取客户端的MAC地址
*
*@param int $Tmpa 支持for循环的临时参数
*@param array $Tmarr 存放列表信息的临时数组
*@return 返回值:客户端MAC
*/
public function getVisitMac(){
@exec("arp -a",$Tmarr);
$ip=$this->getVisitIp();
for($Tmpa;$Tmpa if(eregi($ip,$Tmarr[$Tmpa])){
self::$Vmac=explode(" ",$Tmarr[$Tmpa]);
}
}
return self::$Vmac[11];
}
public function filter($mac,$ip){ //定义一个过滤MAC的函数 @return string $clinetMac
$Ecar=array_shift($mac);
while(count($mac)<>0){
$Ecar=array_pop($mac);
if(substr_count($Ecar,$ip)==1){
$clientMac=trim($Ecar);
$clientMac=str_replace($ip," ",$clientMac);
$clientMac=str_split(trim($clientMac),17);
return $clientMac=$clientMac[0];
}
}
}
}
?>
阅读(378) | 评论(0) | 转发(0) |