Как идентифицировать посетителя? Когда-то давно для этой задачи были придуманы Cookie. Однако есть гораздо больше способов идентификации. Многие технологии так или иначе передают информацию о пользователе и компьютере. Все это позволяет узнавать даже посетителя, который специально удалил куки, сменил браузер и перешел на другой IP. Примеры Некоторые примеры подобных сервисов есть в интернете. Panopticlick Сайт ****://panopticlick.eff.org/ использует открыто предоставляемую браузером информацию для идентификации. Ему не нужны Cookie. Просто зайдите на него и нажмите красную кнопку Test Me. Мой браузер - уникален. А ваш? Evercookie Библиотека Evercookie на ****://samy.pl/evercookie/ позволяет сохранять информацию, используя HTML5, Flash и другие средства. Удалить ее, просто почистив Cookie, невозможно. И не только... Ресурсы выше - так, детские игры. Возможностей по идентификации гораздо больше. Многие из них вы найдете в этой статье. Во всяком случае, полнее обзора я не встречал. Даже просили не публиковать Как можно использовать? На ум приходит как минимум несколько применений. Реклама.. Петя, это ты… Ну и что, что куки отключены… Купи слона! Бан.. Вася, тебе же сказали. За-ба-нен! И прекрати менять IP/браузеры. Наблюдение и сбор информации.. Большой брат смотрит за тобой. Подозреваю, что могут быть и другие примеры использования. Компоненты цифровой подписи Различные технологии позволяют серверу получать информацию о браузере и компьютере. Фрагменты этой информации образуют подпись, которая, как вы наверно уже видели на ****://panopticlick.eff.org/, позволяет успешно идентифицировать компьютер. Работа с Cookie Да, Cookie - это old school. С точки зрения идентификации - работают, но не фонтан. Вася знает про куки. Злой тролль знает про куки и может их удалить или отключить.. Но интересно то, что иногда их и поставить - проблема. Даже если удалять никто не собирается. 3rd party cookie Рассмотрим ситуацию... На странице установлен скрипт или даже iframe. Может ли он поставить свои cookie, и тем самым пометить посетителя? А перед тем, как вы скажете да, разумеется, любой ****-ответ может поставить cookie - небольшой пример. Пример Вот iframe. Она загрузит iframe, который ставит cookie в заголовке и в javascript, а затем выведет текущие cookie на экран. Код: 01 <?php setcookie(sid, rand(),0,/); ?><!DOCTYPE HTML>02 <html>03 <head>04 <script>0506 document.cookie = sid= + Math.random() + ;path=/07 alert(document.cookie)0809 </script> 10 </head>11 <body></body>12 </html>[/CODE] Вот страница для просмотра этого ифрейма. Запустите ее в IE или Safari: Код: 1 <!DOCTYPE HTML>2 <html>3 <body>45 <iframe src=****://ilyakantor.ru/js/3rd/frame.php height=100></iframe>67 </body>8 </html> При настройках браузера по умолчанию, вы должны увидеть пустой алерт. Это означает, что кука не поставилась. Дело в том, что cookie с других доменов имеют особое название 3rd party cookie и особое отношение со стороны браузера. Браузеры можно настроить на запрет таких Cookies. Но пример выше не ставит куку даже при настройках по умолчанию. В чем дело? P3P IE не ставит 3rd party cookies без специальной политики P3P (****://ru.wikipedia.org/wiki/P3P), которую можно передать в серверных заголовках. Эта политика показывает, в каких целях вы метите пользователя, что вы собираетесь делать с информацией о нем в дальнейшем. Здесь все довольно просто - сервер с другого домена должен добавить заголовок, можно вот такой: Код: header(P3P: CP=NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM); Обход блокирования 3rd party cookies ... Но это не все. Настройки Safari по умолчанию запрещают прием 3rd party cookies. Аналогичную опцию можно включить и в ряде других браузеров. Хорошо если такие куки вам не обязательны, а если они - важная часть системы, например, кросс-доменной авторизации? Чтобы обойти засаду, нужно дать браузеру понять, что ваша кука - не какая-то там левая, а что пользователь действительно осуществляет навигацию по ифрейму. Для этого достаточно отправить в iframe POST-запрос, и в ответ на него сервер с другого домена уже может передать cookie, которые браузер примет как родные. Код фрейма: После этого IE будет радостно ставить переданные куки. Код: 01 <?php02 setcookie(sid, time(),0,/);03 header(P3P: CP=NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM);0405 ?><!DOCTYPE HTML>06 <html>07 <head>08 <script>0910 alert(document.cookie)1112 </script> 13 </head>14 <body></body>15 </html>[/CODE] Код страницы для просмотра в Safari или другом браузере с запретом 3rd party cookies: Код: 01 <!DOCTYPE HTML>02 <body>03 <script>0405 onload = function() {06 var div = document.createElement(div)07 document.body.appendChild(div)0809 div.innerHTML = <iframe src= name=iframe></iframe> 10 <form method=POST target=iframe action=****://ilyakantor.ru/js/3rd/frame_hack.php></form>1112 div.getElementsByTagName(form)[0].submit()13 }1415 </script> 16 </body>[/CODE] Попробовали? Должно быть все в порядке. И еще пара заметок. * Строго говоря, это не совсем хак, ведь такой iframe - не чужой внешнему окну. В него происходит POST.. А значит, скорее всего такой подход будет работать и далее. * P3P-политика будет работать и для других объектов: подключаемых скриптов, картинок и так далее. Но... Только в IE. Другие браузеры ее не уважают, так что для Safari пока только iframe. Javascript С помощью javascript из браузера можно извлечь массу всего интересного. И не только извлечь, но и сохранить. Browser Persistency Этим ёмким словом называются различные варианты сохранения информации в браузере. Если подробнее: * userData (IE*) * HTML5 localStorage (все современные браузеры) * HTML5 database (Chrome, Safari, Opera) Всё это позволяет сохранить информацию в браузере, которая, в отличие от cookie, не пересылается на сервер при ****-запросах. Более подробно о технологии вы можете почитать на сайте ****://browserpersistence.ru/ и в статье Хранение данных на клиенте DOM Storage и его аналоги (****://javascript.ru/unsorted/storage). Пример - ниже. Там iframe с адреса ****://javascript.ru/files/id/persistence.html, по нажатию на Save сохраняет данные из текстового поля во все доступные хранилища, по Load - восстанавливает. Кнопка Refresh перегружает страницу. А впрочем, можно и браузер переоткрыть, разницы не будет. Код: <iframe width=400 height=130 src=****://javascript.ru/files/id/persistence.html></iframe> navigator С помощью Javascript доступен замечательный объект nagivator (*****://developer.mozilla.org/en/DOM/window.navigator), содержащий полную информацию о браузере посетителя и название его OS . Код: 1 <pre>2 <script>34 for(var prop in navigator) {5 if (navigator[prop] instanceof Object || navigator[prop]===) continue6 document.writeln(prop+: +navigator[prop])7 }89 </script> Многие из этих свойств не изменяются даже при обновлении мажорной версии браузера, не говоря уже минорной. screen Для полноты картины все об экране посетителя расскажет объект screen. Код: 1 <pre>2 <script>34 for(var prop in screen) {5 if (navigator[prop] instanceof Object || screen[prop]===) continue6 document.writeln(prop+: +screen[prop])7 }89 </script> Плюс этой информации - в том, что этот компонент подписи очень стабилен и не меняется почти никогда. navigator.plugins Для всех браузеров, кроме IE, этот объект содержит информацию о плагинах и их версии. Посмотрите сами: Код: 01 <pre>02 <script>03 var prev04 for(var i=0;i<navigator.plugins.length;i++) {05 var plugin = navigator.plugins06 var plugin = plugin.name+ +(plugin.version || )07 if (prev == plugin ) continue08 document.writeln(plugin )09 prev = plugin10 }1112 </script> Вася обновил браузер? Нич