我见过像spypig.com这样的服务,在电子邮件中放置一个小图像,并在打开电子邮件时从哪里开始跟踪。他们跟踪城市,国家,IP地址等。这是怎么做到的?
答案 0 :(得分:52)
基本上,在您的电子邮件的HTML正文中,会有一个<img>
标记,如下所示:
<img src="http://www.yoursite.com/tracker.php?id=123456" alt="" />
如果有人在阅读邮件时启用了图片,则电子邮件客户端会向tracker.php
发送请求,以加载图片,并将其作为参数传递给id=123456
。
这个tracker.php
脚本将在您的服务器上,并且在被调用时,它将:
id
参数id
个不同的邮件地址。
tracker.php
脚本知道它被调用的IP地址 - 就像任何其他PHP脚本一样:
$ipAddress = $_SERVER['REMOTE_ADDR'];
并且,从此IP地址开始,您可以使用地理定位服务来查找电子邮件已在世界上的哪个位置打开。
作为几个示例,您可以查看MaxMind或IPInfoDB
如您所知id=123456
对应于一个特定的电子邮件地址,这样可以找出每个订阅者的位置。
答案 1 :(得分:9)
<强> 1。将跟踪器图像放在电子邮件
<img src="http://www.yoursite.com/tracker.php?eid=123456&uid=123" alt="" width="1px" height="1px">
它的工作非常简单,一旦你的邮件打开,那个跟踪器图像就会将请求发送到服务器,从那个请求我们可以通过用userID创建图像URL来获取信息,并且还认为该邮件是由用户。
注意:不要使用display:none;用于隐藏图像的属性,可以通过垃圾邮件算法进行过滤。并且不要放置任何javascript代码,它也会阻止垃圾邮件过滤器
<强> 2。在tracker.php
<?php
header("Content-Type: image/jpeg"); // it will return image
readfile("img.jpg");
dbfunction(); // place your db code
?>
第3。 ip地址由以下函数获得。
function get_client_ip() {
$ipaddress = '';
if (isset($_SERVER['HTTP_CLIENT_IP']))
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
$ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
$ipaddress = $_SERVER['REMOTE_ADDR'];
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
$PublicIP = get_client_ip();
<强> 4。位置:强>
任何地理定位服务都可以获得该位置,您可以使用nekudo,freegeoip这样的开源GeoLocation查找程序。
例如
<?php
$json = file_get_contents("https://freegeoip.net/json/$PublicIP");
$json = json_decode($json ,true);
$country = $json['country_name'];
$region= $json['region_name'];
$city = $json['city'];
?>
答案 2 :(得分:3)
其他答案很好,但是,由于人类似乎确信“任何跟踪都是邪恶的跟踪”,因此我想通过保留 .png
/ .jpg
/ .gif
等图片文件扩展名。
我不确定与所有类型的Web服务器和主机是否兼容,但是对我来说,这是对.htaccess
中已经有了的AddHandler指令的快速更改,例如:>
AddHandler application/x-httpd-lsphp .png
......以允许在扩展名为.png
的文件中处理PHP代码。
您可能已经有了一个AddHandler
行,以允许.htm
/ .html
文件中的PHP;如果是这样,只需将适当的图像文件扩展名添加到列表的末尾即可。
这大概是我的“跟踪图像”代码,文件另存为trackimage.png
或其他任何内容:
<?php //silently log user and return image
$ip=$_SERVER['REMOTE_ADDR'];
$uri=tidy($_SERVER['SCRIPT_URI']);
$querystring=tidy($_SERVER['QUERY_STRING']);
$useragent=tidy($_SERVER['HTTP_USER_AGENT']);
$json = file_get_contents("https://ipinfo.io/".$ip."/geo");
if(($json<>'')&&(strpos($json,"error")===false)){ extract(json_decode($json ,true)); }
$country=tidy($country);
$prov=tidy($region);
$city=tidy($city);
list($lat,$lon)=explode(',',$loc);
$lat=tidy($lat);
$lon=tidy($lon);
$sql = "INSERT INTO img_track_table set ip='$ip', useragent=$useragent, uri=$uri, "
."querystring=$querystring, country=$country, prov=$prov, city=$city, lat=$lat, lon=$lon;";
require 'connect.php'; $conn=new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) { /* couldn't connect, but do nothing about it */ }
}else{ //run insert query
if(!$conn->query($sql)) { /* query error, but do nothing about it */ }
$conn->close();
}
//return image
header("Content-Type: image/png");
readfile("myActualImageFile.png");
function tidy($str){ //remove quotes and backslashes from string
if(is_null($str)||($str=="")){return "null";}
$str=trim(str_replace('\\','',str_replace("'","",str_replace('"',"",$str))));
if(is_numeric($str)){return $str;}
return "'$str'";
}
请注意,如果图像之前的代码返回了错误文本或其他内容,则该图像将无法显示。可能还需要研究可能适用于您的情况的安全性问题。例如this。
答案 3 :(得分:2)
关于问题的第一部分,我所做的是从php文件返回图像。除了返回图像(它可以是1x1像素透明png)之外,将所有信息记录到数据库中。这样,当调用php文件时,您知道图像已加载,即已读取电子邮件。问题是很多现代客户不会自动加载图像。出于隐私原因,这是不允许你尝试做的事情。
关于第二部分,有几个地理定位Web服务,您可以在其中提交IP并获取地理位置。您可以在返回1x1像素图像的php文件中执行此操作。 这是一个关于这个网站的好主题: Geolocation web service recommendations