<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=Https_%D0%B8%D0%BB%D0%B8_%D0%B7%D0%B0%D1%89%D0%B8%D1%89%D0%B0%D0%B5%D0%BC_web</id>
	<title>Https или защищаем web - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=Https_%D0%B8%D0%BB%D0%B8_%D0%B7%D0%B0%D1%89%D0%B8%D1%89%D0%B0%D0%B5%D0%BC_web"/>
	<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=Https_%D0%B8%D0%BB%D0%B8_%D0%B7%D0%B0%D1%89%D0%B8%D1%89%D0%B0%D0%B5%D0%BC_web&amp;action=history"/>
	<updated>2026-04-03T17:24:23Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.1</generator>
	<entry>
		<id>https://support.qbpro.ru/index.php?title=Https_%D0%B8%D0%BB%D0%B8_%D0%B7%D0%B0%D1%89%D0%B8%D1%89%D0%B0%D0%B5%D0%BC_web&amp;diff=729&amp;oldid=prev</id>
		<title>imported&gt;Vix: Новая страница: «'''Способы идентификации в интернете''' [http://javascript.ru/unsorted/id#demo статья тут]  Как идентифициро…»</title>
		<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=Https_%D0%B8%D0%BB%D0%B8_%D0%B7%D0%B0%D1%89%D0%B8%D1%89%D0%B0%D0%B5%D0%BC_web&amp;diff=729&amp;oldid=prev"/>
		<updated>2013-08-31T20:13:25Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «&amp;#039;&amp;#039;&amp;#039;Способы идентификации в интернете&amp;#039;&amp;#039;&amp;#039; [http://javascript.ru/unsorted/id#demo статья тут]  Как идентифициро…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''Способы идентификации в интернете''' [http://javascript.ru/unsorted/id#demo статья тут]&lt;br /&gt;
&lt;br /&gt;
Как идентифицировать посетителя?&lt;br /&gt;
&lt;br /&gt;
Когда-то давно для этой задачи были придуманы Cookie.&lt;br /&gt;
&lt;br /&gt;
Однако есть гораздо больше способов идентификации. Многие технологии так или&lt;br /&gt;
иначе передают информацию о пользователе и компьютере.&lt;br /&gt;
&lt;br /&gt;
Все это позволяет &amp;quot;узнавать&amp;quot; даже посетителя, который специально удалил куки,&lt;br /&gt;
сменил браузер и перешел на другой IP.&lt;br /&gt;
&lt;br /&gt;
Примеры&lt;br /&gt;
&lt;br /&gt;
Некоторые примеры подобных сервисов есть в интернете.&lt;br /&gt;
&lt;br /&gt;
Panopticlick&lt;br /&gt;
&lt;br /&gt;
Сайт http://panopticlick.eff.org/ использует открыто предоставляемую браузером&lt;br /&gt;
информацию для идентификации. Ему не нужны Cookie.&lt;br /&gt;
&lt;br /&gt;
Просто зайдите на него и нажмите красную кнопку &amp;quot;Test Me&amp;quot;. Мой браузер -&lt;br /&gt;
уникален. А ваш?&lt;br /&gt;
&lt;br /&gt;
Evercookie&lt;br /&gt;
&lt;br /&gt;
Библиотека Evercookie на http://samy.pl/evercookie/ позволяет сохранять&lt;br /&gt;
информацию, используя HTML5, Flash и другие средства. Удалить ее, просто&lt;br /&gt;
почистив Cookie, невозможно.&lt;br /&gt;
&lt;br /&gt;
И не только...&lt;br /&gt;
&lt;br /&gt;
Ресурсы выше - так, детские игры.&lt;br /&gt;
&lt;br /&gt;
Возможностей по идентификации гораздо больше. Многие из них вы найдете в этой&lt;br /&gt;
статье. Во всяком случае, полнее обзора я не встречал. Даже просили не&lt;br /&gt;
публиковать &lt;br /&gt;
&lt;br /&gt;
Как можно использовать?&lt;br /&gt;
&lt;br /&gt;
На ум приходит как минимум несколько применений.&lt;br /&gt;
&lt;br /&gt;
Реклама..&lt;br /&gt;
&amp;quot;Петя, это ты… Ну и что, что куки отключены… Купи слона!&amp;quot;&lt;br /&gt;
Бан..&lt;br /&gt;
&amp;quot;Вася, тебе же сказали. За-ба-нен! И прекрати менять IP/браузеры.&amp;quot;&lt;br /&gt;
Наблюдение и сбор информации..&lt;br /&gt;
Большой брат смотрит за тобой.&lt;br /&gt;
Подозреваю, что могут быть и другие примеры использования.&lt;br /&gt;
&lt;br /&gt;
Компоненты цифровой подписи&lt;br /&gt;
&lt;br /&gt;
Различные технологии позволяют серверу получать информацию о браузере и&lt;br /&gt;
компьютере.&lt;br /&gt;
&lt;br /&gt;
Фрагменты этой информации образуют подпись, которая, как вы наверно уже видели&lt;br /&gt;
на http://panopticlick.eff.org/, позволяет успешно идентифицировать компьютер.&lt;br /&gt;
&lt;br /&gt;
Работа с Cookie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Да, Cookie - это &amp;quot;old school&amp;quot;. С точки зрения идентификации - работают, но не&lt;br /&gt;
фонтан. Вася знает про куки. Злой тролль знает про куки и может их удалить или&lt;br /&gt;
отключить..&lt;br /&gt;
&lt;br /&gt;
Но интересно то, что иногда их и поставить - проблема. Даже если удалять никто&lt;br /&gt;
не собирается.&lt;br /&gt;
&lt;br /&gt;
3rd party cookie&lt;br /&gt;
&lt;br /&gt;
Рассмотрим ситуацию... На странице установлен скрипт или даже iframe. Может ли&lt;br /&gt;
он поставить свои cookie, и тем самым пометить посетителя?&lt;br /&gt;
&lt;br /&gt;
А перед тем, как вы скажете &amp;quot;да, разумеется, любой HTTP-ответ может поставить&lt;br /&gt;
cookie&amp;quot; - небольшой пример.&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
&lt;br /&gt;
Вот iframe. Она загрузит iframe, который ставит cookie в заголовке и в&lt;br /&gt;
javascript, а затем выведет текущие cookie на экран.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php setcookie('sid', rand(),0,'/'); ?&amp;gt;&amp;lt;!DOCTYPE HTML&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  document.cookie = 'sid=' + Math.random() + ';path=/'&lt;br /&gt;
  alert(document.cookie)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Вот страница для просмотра этого ифрейма. Запустите ее в IE или Safari:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE HTML&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe src=&amp;quot;http://ilyakantor.ru/js/3rd/frame.php&amp;quot; height=&amp;quot;100&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
При настройках браузера по умолчанию, вы должны увидеть пустой алерт. Это&lt;br /&gt;
означает, что кука не поставилась.&lt;br /&gt;
&lt;br /&gt;
Дело в том, что cookie с других доменов имеют особое название &amp;quot;3rd party cookie&amp;quot;&lt;br /&gt;
и особое отношение со стороны браузера.&lt;br /&gt;
&lt;br /&gt;
Браузеры можно настроить на запрет таких Cookies. Но пример выше не ставит куку&lt;br /&gt;
даже при настройках по умолчанию. В чем дело?&lt;br /&gt;
&lt;br /&gt;
P3P&lt;br /&gt;
&lt;br /&gt;
IE не ставит 3rd party cookies без специальной политики P3P, которую можно&lt;br /&gt;
передать в серверных заголовках. Эта политика показывает, в каких целях вы&lt;br /&gt;
&amp;quot;метите&amp;quot; пользователя, что вы собираетесь делать с информацией о нем в&lt;br /&gt;
дальнейшем.&lt;br /&gt;
&lt;br /&gt;
Здесь все довольно просто - сервер с другого домена должен добавить заголовок,&lt;br /&gt;
можно вот такой:&lt;br /&gt;
&lt;br /&gt;
header('P3P: CP=&amp;quot;NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM&amp;quot;');&lt;br /&gt;
После этого IE будет радостно ставить переданные куки.&lt;br /&gt;
&lt;br /&gt;
Обход блокирования 3rd party cookies&lt;br /&gt;
&lt;br /&gt;
... Но это не все. Настройки Safari по умолчанию запрещают прием 3rd party&lt;br /&gt;
cookies. Аналогичную опцию можно включить и в ряде других браузеров.&lt;br /&gt;
&lt;br /&gt;
Хорошо если такие куки вам не обязательны, а если они - важная часть системы,&lt;br /&gt;
например, кросс-доменной авторизации?&lt;br /&gt;
&lt;br /&gt;
Чтобы обойти засаду, нужно дать браузеру понять, что ваша кука - не какая-то там&lt;br /&gt;
&amp;quot;левая&amp;quot;, а что пользователь действительно осуществляет навигацию по ифрейму.&lt;br /&gt;
&lt;br /&gt;
Для этого достаточно отправить в iframe POST-запрос, и в ответ на него сервер с&lt;br /&gt;
другого домена уже может передать cookie, которые браузер примет как родные.&lt;br /&gt;
&lt;br /&gt;
Код фрейма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
setcookie('sid', time(),0,'/');&lt;br /&gt;
header('P3P: CP=&amp;quot;NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM&amp;quot;'); &lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&amp;lt;!DOCTYPE HTML&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alert(document.cookie)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Код страницы для просмотра в Safari или другом браузере с запретом 3rd party&lt;br /&gt;
cookies:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE HTML&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onload = function() {&lt;br /&gt;
    var div = document.createElement('div')&lt;br /&gt;
    document.body.appendChild(div)&lt;br /&gt;
&lt;br /&gt;
    div.innerHTML = '&amp;lt;iframe src=&amp;quot;&amp;quot; name=&amp;quot;iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt; \&lt;br /&gt;
&amp;lt;form method=&amp;quot;POST&amp;quot; target=&amp;quot;iframe&amp;quot;&lt;br /&gt;
action=&amp;quot;http://ilyakantor.ru/js/3rd/frame_hack.php&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
    div.getElementsByTagName('form')[0].submit()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
Попробовали? Должно быть все в порядке.&lt;br /&gt;
&lt;br /&gt;
И еще пара заметок.&lt;br /&gt;
&lt;br /&gt;
Строго говоря, это не совсем хак, ведь такой iframe - не чужой внешнему окну. В&lt;br /&gt;
него происходит POST.. А значит, скорее всего такой подход будет работать и&lt;br /&gt;
далее.&lt;br /&gt;
P3P-политика будет работать и для других объектов: подключаемых скриптов,&lt;br /&gt;
картинок и так далее. Но... Только в IE. Другие браузеры ее не уважают, так что&lt;br /&gt;
для Safari пока только iframe.&lt;br /&gt;
Javascript&lt;br /&gt;
&lt;br /&gt;
С помощью javascript из браузера можно извлечь массу всего интересного. И не&lt;br /&gt;
только извлечь, но и сохранить.&lt;br /&gt;
&lt;br /&gt;
Browser Persistency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Этим ёмким словом называются различные варианты сохранения информации в&lt;br /&gt;
браузере.&lt;br /&gt;
&lt;br /&gt;
Если подробнее:&lt;br /&gt;
&lt;br /&gt;
userData (IE*)&lt;br /&gt;
HTML5 localStorage (все современные браузеры)&lt;br /&gt;
HTML5 database (Chrome, Safari, Opera)&lt;br /&gt;
Всё это позволяет сохранить информацию в браузере, которая, в отличие от cookie,&lt;br /&gt;
не пересылается на сервер при HTTP-запросах.&lt;br /&gt;
&lt;br /&gt;
Более подробно о технологии вы можете почитать на сайте&lt;br /&gt;
http://browserpersistence.ru/ и в статье Хранение данных на клиенте. DOM Storage&lt;br /&gt;
и его аналоги..&lt;br /&gt;
&lt;br /&gt;
Пример - ниже. Там iframe с адреса&lt;br /&gt;
http://javascript.ru/files/id/persistence.html, по нажатию на Save сохраняет&lt;br /&gt;
данные из текстового поля во все доступные хранилища, по Load - восстанавливает.&lt;br /&gt;
&lt;br /&gt;
Кнопка Refresh перегружает страницу. А впрочем, можно и браузер переоткрыть,&lt;br /&gt;
разницы не будет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
navigator&lt;br /&gt;
&lt;br /&gt;
С помощью Javascript доступен замечательный объект nagivator, содержащий полную&lt;br /&gt;
информацию о браузере посетителя и название его OS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  for(var prop in navigator) { &lt;br /&gt;
    if (navigator[prop] instanceof Object || navigator[prop]==='') continue&lt;br /&gt;
    document.writeln(prop+&amp;quot;: &amp;quot;+navigator[prop])&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
Многие из этих свойств не изменяются даже при обновлении мажорной версии&lt;br /&gt;
браузера, не говоря уже минорной.&lt;br /&gt;
&lt;br /&gt;
screen&lt;br /&gt;
&lt;br /&gt;
Для полноты картины все об экране посетителя расскажет объект screen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  for(var prop in screen) { &lt;br /&gt;
    if (navigator[prop] instanceof Object || screen[prop]==='') continue&lt;br /&gt;
    document.writeln(prop+&amp;quot;: &amp;quot;+screen[prop])&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
Плюс этой информации - в том, что этот компонент подписи очень стабилен и не&lt;br /&gt;
меняется почти никогда.&lt;br /&gt;
&lt;br /&gt;
navigator.plugins&lt;br /&gt;
&lt;br /&gt;
Для всех браузеров, кроме IE, этот объект содержит информацию о плагинах и их&lt;br /&gt;
версии. Посмотрите сами:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var prev&lt;br /&gt;
  for(var i=0;i&amp;lt;navigator.plugins.length;i++) { &lt;br /&gt;
    var plugin = navigator.plugins[i]&lt;br /&gt;
    var plugin = plugin.name+&amp;quot; &amp;quot;+(plugin.version || '')&lt;br /&gt;
    if (prev == plugin ) continue&lt;br /&gt;
    document.writeln(plugin )&lt;br /&gt;
    prev = plugin &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
Вася обновил браузер? Ничего! Большинство плагинов по-прежнему такие же и тех же&lt;br /&gt;
версий.&lt;br /&gt;
&lt;br /&gt;
Плагины IE&lt;br /&gt;
&lt;br /&gt;
В IE все сложнее. Плагины там являются компонентами ActiveX, поэтому получить их&lt;br /&gt;
список нельзя. Однако, есть workaround - обернуть создание компонентов в&lt;br /&gt;
try..catch:&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
  new ActiveXObject('плагин')&lt;br /&gt;
  // плагин есть&lt;br /&gt;
} catch(e) {&lt;br /&gt;
 // плагина нет&lt;br /&gt;
}&lt;br /&gt;
Все несколько сложнее, если нас интересует еще и версия, однако делается без&lt;br /&gt;
особых проблем, и даже без VBScript.&lt;br /&gt;
&lt;br /&gt;
Замечательная статья по этому поводу: Detecting plugins in Internet Explorer.&lt;br /&gt;
&lt;br /&gt;
Обнаруживаемые плагины:&lt;br /&gt;
&lt;br /&gt;
Adobe Reader&lt;br /&gt;
Flash Player&lt;br /&gt;
Java Runtime Environment&lt;br /&gt;
QuickTime Player&lt;br /&gt;
RealPlayer&lt;br /&gt;
Shockwave Player&lt;br /&gt;
Windows Media Player&lt;br /&gt;
Весьма внушительный список, который можно даже немного порезать - и все равно&lt;br /&gt;
будет неплохо.&lt;br /&gt;
&lt;br /&gt;
Date&lt;br /&gt;
&lt;br /&gt;
Объект Date содержит временную зону посетителя.&lt;br /&gt;
&lt;br /&gt;
alert( -new Date().getTimezoneOffset()/60 )&lt;br /&gt;
Это еще один стабильный компонент для идентификации.&lt;br /&gt;
&lt;br /&gt;
ActiveX (IE)&lt;br /&gt;
&lt;br /&gt;
Потенциально ActiveX может очень многое. Но при обращении к большинству из них&lt;br /&gt;
браузер запросит подтверждение у посетителя.&lt;br /&gt;
&lt;br /&gt;
Для идентификации, особенно скрытой, такое явное раскрытие себя ни к чему.&lt;br /&gt;
&lt;br /&gt;
Однако, получить список системных шрифтов при помощи ActiveX - проще пареной&lt;br /&gt;
репы. И без всяких вопросов.&lt;br /&gt;
&lt;br /&gt;
Следующий пример будет работать, только в IE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;object id=&amp;quot;dialogHelper&amp;quot; classid=&amp;quot;clsid:3050F819-98B5-11CF-BB82-00AA00BDCE0B&amp;quot;&lt;br /&gt;
width=&amp;quot;0px&amp;quot; height=&amp;quot;0px&amp;quot;&amp;gt;&amp;lt;/object&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
onload = function() {&lt;br /&gt;
  var dlg = document.getElementById('dialogHelper')&lt;br /&gt;
&lt;br /&gt;
  var fonts = []&lt;br /&gt;
  for (var i=0; i&amp;lt;dlg.fonts.count; i++) {&lt;br /&gt;
    fonts.push('&amp;lt;div style=&amp;quot;font-family:' + dlg.fonts(i+1) + '&amp;quot;&amp;gt;' +&lt;br /&gt;
dlg.fonts(i+1)+ '&amp;lt;/div&amp;gt;')&lt;br /&gt;
  }&lt;br /&gt;
  document.write(fonts.join(&amp;quot;&amp;quot;))&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
Flash&lt;br /&gt;
&lt;br /&gt;
Local Storage&lt;br /&gt;
&lt;br /&gt;
Как известно, у Flash есть свое локальное хранилище, в которое можно записывать&lt;br /&gt;
данные и доставать их оттуда.&lt;br /&gt;
&lt;br /&gt;
При этом Flash может замечательно взаимодействовать с Javascript, см. статью&lt;br /&gt;
Javascript &amp;lt;-&amp;gt; Flash мост.&lt;br /&gt;
&lt;br /&gt;
То есть, самый простой способ - это сохранить идентификатор посетителя и потом&lt;br /&gt;
проверять его по необходимости.&lt;br /&gt;
&lt;br /&gt;
Важно, что в отличие от методов хранения HTML 5, flash-хранилище привязано не к&lt;br /&gt;
домену страницы, а к домену, с которого загружено flash-приложение.&lt;br /&gt;
Иначе говоря, flash'ка с домена http://ads.com, находясь на странице&lt;br /&gt;
http://a.com и http://b.com имеет одинаковое хранилище. Даже если эти страницы&lt;br /&gt;
открывают в разных браузерах - хранилище разделяется, т.к. привязано не к&lt;br /&gt;
браузеру, а к пользователю компьютера (на уровне OS).&lt;br /&gt;
&lt;br /&gt;
Сведения о системе&lt;br /&gt;
&lt;br /&gt;
Для получения сведений из Flash можно использовать объекты:&lt;br /&gt;
&lt;br /&gt;
system.Capabilities&lt;br /&gt;
text.Font&lt;br /&gt;
..а также некоторые другие.&lt;br /&gt;
Таким образом можно получить:&lt;br /&gt;
&lt;br /&gt;
Сведения об экране.&lt;br /&gt;
Сведения об операционной системе и ее возможностях.&lt;br /&gt;
Список системных шрифтов.&lt;br /&gt;
Всю эту красоту можно передать либо в Javascript, либо напрямую на сервер.&lt;br /&gt;
&lt;br /&gt;
Javascript отключен?&lt;br /&gt;
&lt;br /&gt;
Flash работает даже с выключенным javascript.&lt;br /&gt;
&lt;br /&gt;
Из Flash можно проверить, включен ли JS и, при необходимости, связаться с&lt;br /&gt;
сервером напрямую, используя сокеты: &amp;quot;Тук-тук, я флеш, под IP таким-то сейчас&lt;br /&gt;
сидит Вася...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Java!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...Барабанная дробь.. На сцену выходит Java!&lt;br /&gt;
&lt;br /&gt;
UPDATE 28.02.2011:&lt;br /&gt;
&lt;br /&gt;
До версии 6.22 Java могла выдавать MAC-адрес и внутренние адреса. Сейчас эту&lt;br /&gt;
возможность убрали, но можно, например, собрать все внутренние имена адаптеров,&lt;br /&gt;
а также узнать сетевое имя, информацию о памяти, процессоре, шрифтах и т.п.&lt;br /&gt;
&lt;br /&gt;
При этом Java может как передать данные в Javascript, так и самостоятельно&lt;br /&gt;
отправить POST-запрос с информацией.&lt;br /&gt;
&lt;br /&gt;
Часть статьи ниже не будет работать на последней Java. Будет переписано.&lt;br /&gt;
&lt;br /&gt;
Получение MAC и IP&lt;br /&gt;
&lt;br /&gt;
Здесь нужно немного углубиться в детали. Дело в том, что в интеренет есть много&lt;br /&gt;
примеров на эту тему. Но, как правило, они не работают.&lt;br /&gt;
&lt;br /&gt;
Вот это можно встретить везде (Firefox only?):&lt;br /&gt;
&lt;br /&gt;
var location = window.location&lt;br /&gt;
var address = (new java.net.Socket(location.host, location.port ||&lt;br /&gt;
80)).getLocalAddress()&lt;br /&gt;
&lt;br /&gt;
alert(address)&lt;br /&gt;
Как видно, доступ к java идет напрямую из javascript, то есть не нужно загружать&lt;br /&gt;
апплет. У меня это сработало только в Firefox&lt;br /&gt;
&lt;br /&gt;
А вот - тот же пример, но с получением MAC-адреса.&lt;br /&gt;
&lt;br /&gt;
var location = window.location&lt;br /&gt;
var address = (new java.net.Socket(location.host, location.port ||&lt;br /&gt;
80)).getLocalAddress()&lt;br /&gt;
&lt;br /&gt;
var mac =&lt;br /&gt;
java.net.NetworkInterface.getByInetAddress(address).getHardwareAddress()&lt;br /&gt;
var s = ''&lt;br /&gt;
for(i=0;i&amp;lt;mac.length;i++) {  // привести byte[] к читаемому виду &lt;br /&gt;
	var n = mac[i]  &lt;br /&gt;
	if (n&amp;lt;0) n = 256+n&lt;br /&gt;
	s += n.toString(16)&lt;br /&gt;
}&lt;br /&gt;
alert(s)&lt;br /&gt;
Что делать в других браузерах? Да просто загрузить Java-апплет (код будет&lt;br /&gt;
дальше).&lt;br /&gt;
&lt;br /&gt;
Но!.. И тут есть одно &amp;quot;Но&amp;quot;. Браузер Safari заботится о посетителях. Как мы&lt;br /&gt;
видели выше, он по умолчанию не принимает 3rd party cookies.&lt;br /&gt;
&lt;br /&gt;
И в отношении Java он весьма суров: попытка доступа к сокету вызовет &amp;quot;Permission&lt;br /&gt;
denifed&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
// этот java-код не сработает&lt;br /&gt;
Socket socket = new java.net.Socket(getCodeBase().getHost(), port);&lt;br /&gt;
InetAddress address = socket.getLocalAddress();&lt;br /&gt;
Таким образом, получить текущий адрес, его IP и MAC адаптера не получится.&lt;br /&gt;
&lt;br /&gt;
Но, с другой стороны, никто не мешает получить все доступные адаптеры, их MAC и&lt;br /&gt;
IP, вот так:&lt;br /&gt;
&lt;br /&gt;
Enumeration&amp;lt;NetworkInterface&amp;gt; niEnum = NetworkInterface.getNetworkInterfaces();&lt;br /&gt;
&lt;br /&gt;
while (niEnum.hasMoreElements()) {&lt;br /&gt;
    NetworkInterface ni = niEnum.nextElement();&lt;br /&gt;
    if (ni.getHardwareAddress() != null &amp;amp;&amp;amp; !ni.isLoopback() &amp;amp;&amp;amp; ni.isUp()) {&lt;br /&gt;
        // MAC - в ni.getHardwareAddress()&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
Демо&lt;br /&gt;
&lt;br /&gt;
Если у вас установлена Java, то в iframe ниже вы увидите свой MAC-адрес. Для&lt;br /&gt;
простоты тут пропущено получение IP. Добавить его, как и данные по памяти,&lt;br /&gt;
процессору и т.п. - весьма несложно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходник:&lt;br /&gt;
&lt;br /&gt;
java.zip&lt;br /&gt;
Другие способы&lt;br /&gt;
&lt;br /&gt;
CSS без JS&lt;br /&gt;
&lt;br /&gt;
Есть ли хоть одна технология, которая &amp;quot;не стучит&amp;quot;. Первая мысль была - CSS.&lt;br /&gt;
&lt;br /&gt;
... Как я ошибался.&lt;br /&gt;
&lt;br /&gt;
Современный CSS поддерживает media-query, то есть условия на:&lt;br /&gt;
&lt;br /&gt;
device-width&lt;br /&gt;
device-height&lt;br /&gt;
device-aspect-ratio&lt;br /&gt;
color-index&lt;br /&gt;
Использовать это очень просто. Достаточно добавить несколько условий вида:&lt;br /&gt;
&lt;br /&gt;
 @media screen and (min-device-width: 0px) { &lt;br /&gt;
   #device-width { background: url(/forum/media.php?sid=...&amp;amp;device-width=0); } }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 @media screen and (min-device-width: 800px) { &lt;br /&gt;
   #device-width { background: url(/forum/media.php?sid=...&amp;amp;device-width=800); } &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 @media screen and (min-device-width: 1024px) { &lt;br /&gt;
   #device-width { background: url(/forum/media.php?sid=...&amp;amp;device-width=1024);&lt;br /&gt;
 } &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 @media screen and (min-device-width: 1280px) { &lt;br /&gt;
   #device-width { background: url(/forum/media.php?sid=...&amp;amp;device-width=1280);&lt;br /&gt;
 } &lt;br /&gt;
 }  &lt;br /&gt;
 &lt;br /&gt;
 @media screen and (min-device-width: 1440px) { &lt;br /&gt;
   #device-width { background: url(/forum/media.php?sid=...&amp;amp;device-width=480); } &lt;br /&gt;
 }&lt;br /&gt;
Как видно, условия перекрывают друг друга, и в каждом указана минимальная ширина&lt;br /&gt;
экрана. Например, при экране 1280px будет использован фон&lt;br /&gt;
media.php?key=...&amp;amp;device-width=1280.&lt;br /&gt;
&lt;br /&gt;
Иначе говоря, на сервер отправится запрос, который скажет, что у посетителя&lt;br /&gt;
экран - 1280 пикселей. При этом параметр sid может использоваться для сессии при&lt;br /&gt;
отключенных cookies.&lt;br /&gt;
&lt;br /&gt;
Да, это не внутренний IP, не МАС, но оно работает с отключенными JS и Cookies. А&lt;br /&gt;
это уже чего-то стоит, информация стабильная и очень конкретная. Как компонент&lt;br /&gt;
цифровой подписи - в самый раз.&lt;br /&gt;
&lt;br /&gt;
CSS + History + JS&lt;br /&gt;
&lt;br /&gt;
Можно ли использовать History для хранения идентификатора посетителя? Да, но не&lt;br /&gt;
везде.&lt;br /&gt;
&lt;br /&gt;
Для этого вспомним, что CSS-ссылка посещенная отличается от непосещенной по&lt;br /&gt;
цвету.&lt;br /&gt;
&lt;br /&gt;
Можно создать ссылку с нужным href и, используя getComputedStyle получить цвет,&lt;br /&gt;
т.е. выяснить, посещал ли пользователь ссылку.&lt;br /&gt;
&lt;br /&gt;
Любой идентификатор можно представить в двоичном виде, например 867865 =&lt;br /&gt;
11010011111000011001.&lt;br /&gt;
&lt;br /&gt;
Для записи идентификатора - создаем iframe и последовательно постим туда адреса&lt;br /&gt;
вида /visited/0/1, /visited/1/0, /visited/2/0, /visited/3/1 .. и так далее, с&lt;br /&gt;
конца бинарного числа к началу. Так что для каждого бита будет посещена одна из&lt;br /&gt;
ссылок: /visited/n/1 или /visited/n/0.&lt;br /&gt;
&lt;br /&gt;
Для загрузки идентификатора достаточно создать такие ссылки и проверить, какие&lt;br /&gt;
из них посещены и, таким образом, восстановить число. 32 ссылки - это 32-битный&lt;br /&gt;
идентификатор, его хватит примерно на 4 миллиарда посетителей.&lt;br /&gt;
&lt;br /&gt;
Надо сказать, что такой способ доступа к History через CSS известен уже много&lt;br /&gt;
лет, и дыра постепенно закрывается браузерами, см. например&lt;br /&gt;
https://bugzilla.mozilla.org/show_bug.cgi?id=147777.&lt;br /&gt;
&lt;br /&gt;
IP&lt;br /&gt;
&lt;br /&gt;
С IP все просто, но не совсем. Есть ведь динамические IP.&lt;br /&gt;
&lt;br /&gt;
Что если Вася поменяет динамический адрес, как его отследить? А очень просто -&lt;br /&gt;
записывать в подпись не только сам IP, а провайдера, который его выдал.&lt;br /&gt;
&lt;br /&gt;
Так что переподключение Васю отчасти скроет (если ип другой), но провайдер в&lt;br /&gt;
подписи останется тот же, это упростит идентификацию.&lt;br /&gt;
&lt;br /&gt;
Также по базе GeoIP можно получить регион и страну.&lt;br /&gt;
&lt;br /&gt;
Да, это не 100% надежно, но подпись - компонентная. Каждый компонент может быть&lt;br /&gt;
неуникален, может меняться, но все вместе они однозначно идентифицируют&lt;br /&gt;
посетителя.&lt;br /&gt;
&lt;br /&gt;
HTTP-заголовки&lt;br /&gt;
&lt;br /&gt;
Замечательный и очевидный источник информации:&lt;br /&gt;
&lt;br /&gt;
User-Agent&lt;br /&gt;
Accept&lt;br /&gt;
Keep-Alive&lt;br /&gt;
Via (proxy)&lt;br /&gt;
Редкие заголовки&lt;br /&gt;
Заголовок User-Agent может содержать не только информацию о браузере, но и OS,&lt;br /&gt;
плагины, детали сборки.&lt;br /&gt;
&lt;br /&gt;
Для более надежной обработки User-Agent можно распарсить на компоненты и&lt;br /&gt;
использовать их как независимые части подписи, чтобы обновление одного из&lt;br /&gt;
плагинов не сильно на ней отразилось.&lt;br /&gt;
&lt;br /&gt;
Кэш браузера&lt;br /&gt;
&lt;br /&gt;
Использовать кэш браузера можно различными способами. Самый простой - ETag.&lt;br /&gt;
&lt;br /&gt;
При обращении к странице сервер выдает ETag, который браузер использует для&lt;br /&gt;
кэширования содержимого. При последующих запросах он отправляет этот ETag на&lt;br /&gt;
сервер, который, таким образом, узнает, кто к нему пришел.&lt;br /&gt;
&lt;br /&gt;
В iframe ниже - ваш уникальный ETag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обратите внимание - даже при перезагрузке страницы по Ctrl-F5 кэш ифрейма не&lt;br /&gt;
очищается! То есть, сервер вас по-прежнему будет узнавать, проверьте сами... &lt;br /&gt;
&lt;br /&gt;
Браузерные фичи&lt;br /&gt;
&lt;br /&gt;
Идентифицировать браузер можно и при заведомо кривом UserAgent'е. Достаточно&lt;br /&gt;
посмотреть поддержку различных фич. Причем, для многих из них даже javascript&lt;br /&gt;
включать не обязательно.&lt;br /&gt;
&lt;br /&gt;
Количество одновременных HTTP-соединений&lt;br /&gt;
Поддержка link prefetching&lt;br /&gt;
Поддержка conditional comments&lt;br /&gt;
CSS Hacks and Features&lt;br /&gt;
...&lt;br /&gt;
Скрыть свой браузер и его версию при грамотной проверке фич довольно сложно.&lt;br /&gt;
&lt;br /&gt;
TCP&lt;br /&gt;
&lt;br /&gt;
TCP-протокол с радостью предоставит информацию о вашей операционной системе.&lt;br /&gt;
&lt;br /&gt;
Дело в том, что в различных OS по-разному настроен TCP-стек. А роутер, как&lt;br /&gt;
правило, не меняет пакет, а просто передает его дальше.&lt;br /&gt;
&lt;br /&gt;
Характеристики TCP-пакетов формируют свой фрагмент цифровой подписи.&lt;br /&gt;
&lt;br /&gt;
Для его распознавания проще всего применить утилиту p0f.&lt;br /&gt;
&lt;br /&gt;
Работает очень просто.&lt;br /&gt;
&lt;br /&gt;
Вешается как фильтр пакетов и слушает сокет.&lt;br /&gt;
Сохраняет TCP-сигнатуры пакетов в кеш в памяти, держит их N секунд.&lt;br /&gt;
Веб-сервер отправляет на сокет сообщение &amp;quot;А кто это только что зашел под IP&lt;br /&gt;
X.Y.Z ?&amp;quot;&lt;br /&gt;
p0f выдает OS, которую вычисляет по своей базе из сигнатуры (можно пропатчить,&lt;br /&gt;
чтобы выдавал саму сигнатуру).&lt;br /&gt;
Общий алгоритм&lt;br /&gt;
&lt;br /&gt;
Из всей этой красоты, описанной выше, строится компонентная цифровая подпись.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на сервере умеет сравнивать подписи. Пример такого алгоритма вы можете&lt;br /&gt;
увидеть в статье на https://panopticlick.eff.org/ : How Unique is Your Browser?.&lt;br /&gt;
&lt;br /&gt;
Но Pantoptclick - открытый проект. Он использует лишь небольшую часть приемов,&lt;br /&gt;
описанных в статье, и при этом - весьма эффективен. Реальный алгоритм может быть&lt;br /&gt;
сложнее и гораздо (в десятки и сотни раз) эффективнее.&lt;br /&gt;
&lt;br /&gt;
Как скрыться?&lt;br /&gt;
&lt;br /&gt;
Итак, мы поговорили о том, как идентифицировать посетителя. А теперь -&lt;br /&gt;
поговорим, как скрыться.&lt;br /&gt;
&lt;br /&gt;
Способов идентификации очень много. &amp;quot;Стучит&amp;quot; буквально все.&lt;br /&gt;
&lt;br /&gt;
Одного простого средства типа &amp;quot;privacy mode&amp;quot; в браузере для скрытия&lt;br /&gt;
недостаточно. Нужно одновременно использовать несколько защит:&lt;br /&gt;
&lt;br /&gt;
Privacy/incognito mode&lt;br /&gt;
Закроет возможность идентификации через кеш и различные виды browser storage.&lt;br /&gt;
Желательна последняя версии Flash, т.к. хранилище ранних версий не интегрировано&lt;br /&gt;
с браузером.&lt;br /&gt;
NoScript&lt;br /&gt;
Плагин для Firefox. Перекроет запуск скриптов, апплетов, flash, silverlight и&lt;br /&gt;
другое активное содержимое. Таким образом будет закрыты механизмы идентификации&lt;br /&gt;
через javascript, java, flash.&lt;br /&gt;
Жаль, для других браузеров такого нет.&lt;br /&gt;
&lt;br /&gt;
Клиент к сети Tor, в частности расширение TorButton для Firefox&lt;br /&gt;
Ваши запросы будут приходить с разных IP. Некоторые ресурсы, например Wikipedia,&lt;br /&gt;
блокируют Tor.&lt;br /&gt;
Локальный proxy, который правит заголовки.&lt;br /&gt;
Заголовки типа User-Agent, Accept и т.п. ни в коем случае нельзя резать.&lt;br /&gt;
Если браузер - Firefox (это можно обнаружить по браузерным фичам), а User-Agent&lt;br /&gt;
порезан или IE - это выделит из толпы самым ярчайшим образом.&lt;br /&gt;
&lt;br /&gt;
Самое надежное - это поставить самые типичные заголовки для в вашей версии&lt;br /&gt;
браузера. А любой нестандарт - убрать. Слиться с толпой.&lt;br /&gt;
&lt;br /&gt;
При аккуратном применении этих мер - вас все равно можно будет как-то&lt;br /&gt;
идентифицировать.&lt;br /&gt;
&lt;br /&gt;
Например, отключенный javascript, отключенные cookies - это выделяет из толпы.&lt;br /&gt;
Tor - тоже паттерн (запросы с разных IP в рамках одной сессии).&lt;br /&gt;
&lt;br /&gt;
Но фингерпринтинг - вероятностный метод. Он часто позволяет идентифицировать&lt;br /&gt;
посетителя с вероятностью, близкой к 100%, но eсли посетитель предпринимает&lt;br /&gt;
серьезные усилия по анонимизации, а общее количество посетителей очень большое,&lt;br /&gt;
то эта вероятность падает.&lt;br /&gt;
&lt;br /&gt;
Реально достичь значения - 1 из 50.000. Для ресурсов с сотнями тысяч посетителей&lt;br /&gt;
такое посещение достаточно анонимно.&lt;br /&gt;
&lt;br /&gt;
P.S. После публикации статьи порекомендовали еще behavior clientCaps как&lt;br /&gt;
источник информации, но вся информация оттуда доступна через navigator и screen,&lt;br /&gt;
так что в статью этот источник не добавлен.&lt;/div&gt;</summary>
		<author><name>imported&gt;Vix</name></author>
	</entry>
</feed>