Другие ответы замечательны, но, поскольку человечество, кажется, убеждено, что «любое отслеживание — это злое отслеживание», я хотел бы сделать еще один шаг, будучи «невидимым» для пользователя, сохраняя .png
/.jpg
/.gif
расширение файла изображения.
Я не уверен в совместимости со всеми типами веб-серверов и хостов, но для меня это был быстрый переход на AddHandler, который у меня уже был в .htaccess
, например:
AddHandler application/x-httpd-lsphp .png
...чтобы разрешить обработку PHP-кода в файлах с расширением .png
.
Возможно, у вас уже есть строка AddHandler
, разрешающая PHP в файлах .htm
/.html
; если это так, просто добавьте соответствующее расширение файла изображения в конец списка.
Это, грубо говоря, мой код «отслеживающего изображения», файл, сохраненный как 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'";
}
Обратите внимание, что если текст ошибки или что-либо еще возвращается кодом перед изображением, изображение не будет отображаться. Возможно, также стоит изучить возможные проблемы безопасности, которые могут относиться к вашему случаю. Например, это .
person
ashleedawg
schedule
24.01.2020