Я хочу проверить, посетили ли посетители моего сайта другой конкретный сайт, прежде чем приходить на мой.
Я знаю, как использовать JS и PHP для проверки (через информацию о реферере), если пользователь только что пришел с этого сайта, но я хотел бы узнать, посетили ли они этот сайт в любое время (не сразу перед тем, как приходить на мой сайт). Может ли эта информация быть обнаружена?
К сожалению, это возможно .
Вы можете применить правило CSS к a:visited
которое имеет фоновое изображение для скрипта PHP.
Вы могли это сделать (с JavaScript и CSS psuedo class :visited
), но браузеры исправили этот эксплойт .
Да, конечно! просто спросите другой сайт, можете ли вы поместить скрипт на свой сайт, который передает вашей системе необходимую информацию;)
Существует хак, который позволяет вам это делать, но вы не сможете сделать это детерминистически для всех браузеров, поскольку они могут попытаться скрыть эту информацию. Кроме того, вы не сможете определить это на стороне сервера, но только через клиентскую сторону. Идея заключается в том, чтобы манипулировать таблицей стилей посещенных ссылок, поскольку @SLaks уже указывает, когда я печатал :).
Скажем, если вам было интересно узнать, посетил ли сайт пользователя google.com. Затем вставьте ссылку на google на свою страницу и установите уникальный стиль для посещенных ссылок, последствия которых известны заранее. В приведенном ниже примере посещенные ссылки будут окрашены #012345
.
<style> a:visited { color: #012345; } </style> <a href="http://www.google.com"></a> <a href="http://www.amazon.com"></a>
Затем пройдите через каждую ссылку, которую вы вставили на страницу, и получите ее цвет. Если для приведенного выше примера это #012345
, пользователь посетил эту ссылку. Однако вы не можете получить доступ к своей истории, чтобы узнать, какие сайты они посетили. Это скорее процесс опроса.
Если вы не возражаете против вероятностных ответов, вы можете указать время, необходимое для поиска DNS на соответствующих узлах. Если ответ DNS вернется очень быстро, то они, возможно, недавно сделали запрос DNS для этого узла. Если ответ DNS возвращается медленнее, то они, возможно, не сделали запрос DNS для этого узла в последнее время. Конечно, мой кабельный модем будет давать гораздо более быстрые результаты, чем CDMA или GSM-телефоны, поэтому это может быть полезно, если вы сравниваете несколько сайтов на одной машине.
Изменить , в ответ на точку зрения Алекса об кэшировании DNS ISP:
Например: с локальным кешем DNS мои первоначальные запросы для доменов занимали в среднем 1,6 секунды. (Я полагаю, потому что кеш был очень холодным, и ему нужно было найти серверы имен .com, .co.uk и .co.jp.) Запросы в горячем кэше составляли в среднем 0,006 секунды. Мой DNS-кеш – это рекурсивный резольвер, поэтому он не использует решатели кэширования моего ISP.
Без использования моего локального кеша DNS и использования кеша DNS на моем симпатичном маршрутизаторе мои первоначальные запросы усредняли 0,910 секунды, а запросы к горячему кешу составляли в среднем 0,5 сек. Я не знаю, сохранены ли .4 секунды из кэширования DNS моего маршрутизатора или кэширования моего ISP. Но даже .4 секунды должны быть видны в Javascript.
Достаточно данных, чтобы сделать некоторые догадки: если время для первой и второй попыток разрешения имени домена схоже, вы можете предположить, что кеш был горячим, и адрес использовался недавно. (Возможно, горячий на уровне ISP, но это было продано как вероятностный метод в любом случае. 🙂 Если времена непохожи, вы можете предположить, что кеш был холодным.
При использовании DNS моего провайдера я догадался о девяти «горячих» доменах и девяти «холодных» доменах, а среднее время поиска для горячего было 0,226 секунды, а среднее время поиска для холода составляло 0,308 секунды. Разница в 0,82 секунды может быть недостаточно большой, чтобы заметить в javascript, и она определенно бледнеет по сравнению с различиями между известными горячими и известными холодными образами, использующими локальный кеш или мой милый маленький маршрутизатор для DNS.
Конечно, «горячие» и «холодные» относятся к TTL для каждого отдельного домена.