Раскрытие пользовательских данных при помощи css

CSS*
Технология css несмотря на свою внешнюю безобидность способна преподносить неприятные сюрпризы. К примеру, воспользовавшись двумя стилями и небольшой javascript вставкой, мы получаем возможность проверить совершенно любой адрес на факт его посещения пользователем.

Теория:

Все современные браузеры позволяют использовать специальные псевдо классы при манипулировании со стилями ссылок. Нам интересен класс visited, назначаемый ссылке в том случае, если пользователь уже посещал адресс указанный в её href. На первый взгляд такой подход несёт исключительно положительный результат — пользователь видит уже посещённые ссылки на странице и не путается.
Но веб страницы — это уже давно не только код стилей и разметки, но и обилие скриптовых вставок, без которых многие сайты просто не функционируют. JavaScript код имеет доступ к любому элементу DOM дерева и его свойствам и, значит, может получить информацию о стилях ссылок.

Таким образом, отмечая посещённые ссылки иным цветом нежели в обычном состоянии и проверяя цвет в скрипте, можно сказать, посетил ли пользователь конкретный адрес или нет.

И чем это плохо?

«Подумаешь, проблема!» — может сказать среднестатистический пользователь. Но сколь бы несущественной не казалась данная проблема, недооценивать её не стоит. Любая возможность раскрытия данных в умелых руках может сыграть плохую шутку. Как поведёт себя злоумышленник, узнав, что Вы посещаете сайт любителей хомячков садомазохистов? А в особенности раздел, к примеру, рыжих хомячков? Возможно это ничего не даст ему, а возможно станет первым шагом в сборе информации о Вас для дальнейшего шантажа( добавим паранои для нагнетания атмосферы :) ).
Также, эта техника может быть использованна с определёнными ограничениями для брутфорса Basic HTTP авторизации.

Ограничения

Для раскрытия данных надо знать их потенциальные значения, что означает, что любую ссылку в интернете проверить не получится, а это требует от злоумышленника ввода массива данных, по которым и будет проводиться проверка (хотя, посмотрите пример 2 дальше по тексту).

Есть ли от этого польза

«Нет худа без добра» — никто не помешает использовать данную технологию в мирных целях, к примеру, на странице социальной сети, позволяющей импортировать данные из других сетей, изначально отобразить только те, которые посещает пользователь.
Или же, страница магазина, зная, что пользователь посетил сайт конкурентов, может автоматом подключить промо код, снизящий цены.

Примеры реального кода:

ХаброЮзерЧекер

Проверяет на посещение Вами профилей Хабрапользователей с первой страницы «Люди»

Скрипт

Доменный брутфорсер

Перебирает доменные имена в зоне .ru и выводит список посещённых.

Скрипт
Пользоваться осторожно, может подвесить систему. Результаты появлятся не сразу, и проверяются только домены до 3 букв включительно. (Закончится на take=470).

Это, естественно, плохой подход, гораздо лучше подгружать списки ссылок по мере работы(к примеру сшрабленные из каталогов).

Источники информации:

http://www.gnucitizen.org/blog/javascript-visited-link-scanner/
+65
10 декабря 2008, 06:00
90
Riz 59,3

комментарии (68)

НЛО прилетело и опубликовало эту надпись здесь
+3
Riz #
люди разные бывают, умные сидят в хроме в режиме приватности, а 90% остальных в ие 7.
+3
Riz #
или вообще в ие 6
НЛО прилетело и опубликовало эту надпись здесь
0
Riz #
Пока админов гугла не поймали с поличным, остаёться только верить в их ангельскую честность и беспристрастность. :)
0
nekt #
И остается у нас итого 1% сидящих под анонимайзерами с шифрованием траффика
0
Riz #
Скорее всего гораздо меньше.
+1
nekt #
1% от умных? :)
+1
Riz #
В точку! :)
0
brutaler #
А вот про них узнать то, как раз интересней всего =)
+1
Riz #
Они сами про кого хочешь всё узнают :)
0
Usmekhaiouschiysia #
А зачем?
НЛО прилетело и опубликовало эту надпись здесь
+2
tagirovarthur #
Описание этого метода же проскакивало на Хабре, там он применялся для определения пола пользователя путем анализа страниц, которые он посещал.
Еще одно возможное применение, которое можно найти в комментариях к тому посту:
была написана страничка, которая пыталась «определить» оплата каких услуг может заинтересовать пользователя, применено было для сайта платежной системы.
0
Riz #
Очень интересно, с полом так вообще замечательная идея. Надеюсь моя информация тоже окажется полезной кому-то. Спасибо.
0
tagirovarthur #
Там только одна проблема с полом — пример был ориентирован на зарубежного пользователя ;)
0
Riz #
У меня тут такая идея зарадилась на почве Вашей ссылки, чую как минимум на хороший шоукейс, а то и на мини стартапчик потянет :)
+1
maggg #
Тут пишут, что подобная информация уже проскакивала на Хабре. Проскакивала мимо меня. Я впечатлён. Технология очень сильная и до безумия простая. Нужно придумать достойное применение такому инструменту.
0
Riz #
Я уже придумал, вскоре поделюсь :)
НЛО прилетело и опубликовало эту надпись здесь
+1
MASe #
В теории — информацию такую получить конечно можно. Но не всегда она будет в нужной мере полной… Ну, да, получит кто-то информацию, что этот сайт был посещен. Но как именно, как долго его смотрели, был ли этот поп-ап какой-нибудь, из избранного заход, или через поиск «корм для хомячков» я случайно попал на страничку «хомячков-мазохистов»…
В таком виде — это просто любопытство, хулиганство и проч.

Рекламодателям же, или социальным сетям больше интересны скорее поведенческие характеристики пользователя. Более детальная и глубинная информация важна (от количества заходов на определенные сайты в месяц, до количества страниц, просматриваемых на них)…
Вот тогда польза будет очевидной, ИМХО.
0
Riz #
Ну так это не панацея, а вот как дополнительный источник информации — вполне.
0
djem #
Применений данного метода видится множество. Например, баннеры. Показывать конкретному посетителю те, по которым он не переходил ещё. В общем, технологию можно смело брать на вооружение.

Интересен только вопрос правомерности применения… Кто-нибудь может проконсультировать?
0
Riz #
Тоже интересно, у меня пока ощущение, что раз это стандартный функционал браузера, то ничего неправомерного не происходит.
–1
djem #
Убийство то же можно совершить используя только стандартный функционал многих вещей, которые есть почти у всех на кухне. Мне это не кажется аргументом.
+2
RomanL #
Ну почему же… это можно расценивать как скрытый сбор информации о пользователях, а у нас, вроде как, принят закон который ограничивает сбор и хранение такой информации. Не помню точно название, но разговоры об этом шли где-то полгода-год назад.

PS Дырки в системе безопасности через которые черви лезут тоже можно рассматривать как «стандартный функционал», однако распространение вредоносных программ — это противоправное действие.
0
G0rnap5chtickn3R #
Если так судить, то даже принятие сервером хэдеров браузера, или контекстная реклама, или реклама, сохраняющая поисковые запросы — тоже скрытый сбор информации.
+1
RomanL #
Иненно на этот счет и была полемика по поводу закона. Не помню чем это все закончилось, правда…
+2
Setti #
Это, конечно, интересно, но не многие наверно знают, что не менее просто в IE6 с помощью JavaScript считывается буфер обмена ;)
0
Nuty #
В IE6 есть ещё забавные css expressions. Например div style=«width: expression(window.open(self.location));», может подвесить систему.
+4
Sulako #
можно наверное обойтись и без javascript… используя для :visited несуществующее фоновое изображение и записывая на сервере обращения к нему…
0
Riz #
Можно использовать любое изменение стиля относительно стандартного линка, поскольку пользователь всё равно не увидит этого (по крайней мере в моей реализации) — любой подход будет равносильным.
НЛО прилетело и опубликовало эту надпись здесь
+9
ssneg #
Выудить из доков и предать гласности, да еще снабдив наглядными примерами — это тоже важно. Спасибо автору.
0
Nuty #
Очень точно подмечено, очевидное для одного, не всегда известно другому, потому то все мы здесь и собрались)
0
Riz #
Я именно так и думал, когда писал пост.
0
Riz #
Вам спасибо за тёплые слова.
0
Riz #
Это не открытие, а рассказ о существующей проблеме, которая пока не решена ни в одном браузере(и будет ли решена), и заодно рабочий код который это использует. Судя по отзывам — многи банально не слышали о таком.
0
brutaler #
Никогда не задумывался, что фишку с visited так можно повернуть.
0
leshaogonkov #
удивлен что ska.ru попало в список проверяемых доменов)
вобще, троян, следящий за действиями пользователя, был бы более полезным «довеском», помоему)

Мирное применение данного способо гораздо интереснее, мне так думается)
0
pietrovich #
удивлен что ska.ru попало в список проверяемых доменов)

там перебором пробивалось, поэтому в список попадают все домены до 3-х знаков ;)
0
leshaogonkov #
ойё, даже не подумал об этом
0
pietrovich #
Тут был
ya.ru
fly.ru
jug.ru
lib.ru

не соврал :)

любопытная информация, надо будет покурить ее на досуге, глядишь найдется мирное и полезное применение. как минимум для детектирования кто из клиентов к конкурентам ходит :)))
+1
Riz #
Мне безумно нравится следующий юзеркейс(увы, не верящийся в наших реалиях).

Вы — владелец компании по продажи окон ООО «Скурдж», Ваш заядлый противник и вечный конкурени ООО «Племянники» имеют схожие с Вами цены и уровень услуг. Вы детектите что пользователь пришёл к Вам, предварительно посетив сайт конкурентов и главная страница удивительным образом заполняется новостями о том как Вы продали на 10% больше Племянников, или как обеспечили уровень качества лучше чем у них. А страницы отдельных товаров начинают предлагать Вам ограниченные по времени промо-коды, благодаря которым цена становиться _чуть_ ниже чем у Племмяников, или, что вообще утопично, лезут аяксом через прокси скрипт на страницу аналогичных товаров Племянников и берут цену оттуда. :)
НЛО прилетело и опубликовало эту надпись здесь
+1
pietrovich #
аякси на себя и тяни CURL'ом с сервера ;)
0
Riz #
Вы открыли мне глаза. :) А теперь смотрим на то, что я написал: «лезут аяксом через прокси скрип» и думаем, а зачем я тут написал про прокси.
НЛО прилетело и опубликовало эту надпись здесь
0
Riz #
Объясняю для непонятливых.

Сделать аякс запрос на другой домен естественно нельзя, это не позволяют политики безопастности браузера, но никто не мешает сделать запрос к своему серверу example.com/proxy.php?url=ya.ru

На сервере-же этот крипт всего 1 строка

<?php echo file_get_contents($_REQUEST['url']); ?>
НЛО прилетело и опубликовало эту надпись здесь
0
Riz #
Никто не мешает сделать прокси скрипт более умным, с кешированием страниц. И никто не мешает вообще не делать аякс запросы в регулярно забирать данные с конкурентов и хранить где-то в базе, это было одно из возможных решений, их естественно множество и под каждую ситуацию стоит выбирать своё.
0
pietrovich #
примерно это и имелось в виду.
зная где посетитель обитает кроме твоего сайта можно сформировать для него лучшее относительно конкурентов предложение. идея касательно возвеличивания себя относительно других не очень интересна, а вот «промо-коды» и «спец-предложения» вполне себе инструмент по «перетягиванию одеяла», да…
НЛО прилетело и опубликовало эту надпись здесь
–1
avz #
Тоже такая мысль пришла. Только без вкладок — ходим туда сюда. Снижаем до нуля
0
Riz #
Ну чего Вы придумываете? Магазин всегда установит неснижаемую цену, ниже которой ему будет продавать невыгодно. Плюс, с чего Вы решили, что магазины буду знать о снижении цен друг и друга? Цены снижаются в рамках браузера пользователя(устанавливая какой-то промо код для него).
0
avz #
Ну, во-первых, это слегка юмор.
Во-вторых, про знание магазинов друг о друге — выше писали «лезут аяксом через прокси скрипт на страницу аналогичных товаров».
Хотя в таком случае сервер конкурентов будет иметь запрос уже не от браузера пользователя, а от прокси. Да, похоже, в таком случае вариант со снижением не проходит. Но что вернет сервер на запрос прокси (если знает что это прокси конкурентов) — завышенные цены, чтобы кокурент снизил цены, но они остались все равно высокими, или наоборот заниженные, чтобы конкурент прогорел, снижая цены до минимума?
0
Riz #
А это уже решат магазины :) Но прокси сервер может лезть тоже через прокси, что его обнаружение затруднит.
+2
kurokikaze #
Это можно провернуть и без Javascript — ставя visited-ссылкам разные бэкграунды (например background-image: url(«spacer.gif?ya.ru») ), и затем посмотрев в логах какие из них были скачаны юзером.
0
Riz #
Можно, но мне кажется это гораздо менее удобным решением.
0
russianpiligrim #
тогда можно и сразу php, который будет в писать в базу данные о пользователе.

в css пишем:
.linkya_ru:visited {background-image: url(spacer.php?url=ya.ru)}
.linkkm_ru:visited {background-image: url(spacer.php?url=km.ru)}

в html:
<a href=«ya.ru class=»linkya_ru>ya.ru</a>
<a href=«km.ru class=»linkkm_ru>km.ru</a>

spacer.php
<?php
$url=$_GET['url'];
$user_id=1; //здесь поставить id пользователя, из куки или сессии, где то ведь оно должно быть
$ipaddr = $_SERVER[''REMOTE_ADDR''];
echo "$url $user_id $ipaddr"; // Вместо вывода поставить функцию обработки информации
?>

+1
Riz #
Я вижу тут следующую проблему. Вот у Вас для каждой ссылки свой стиль, это плохо. Потому что обновление DOM дерева на вставку стиля и ссылки будет больше чем только на ссылку.

По поводу получения user_id, если интересно — я могу написать статейку о генерации фингерпринтов для браузера, позволяющей с достаточной уверенностью идентифицировать между вызовами скрипта незарегенных пользователей.
0
avz #
Пишите статейку про фингерпринты
+1
sda #
и эта старая и добрая технология «отпечатков» зовется… cookies .)

хотя, для этого вполне можно прикрутить и хак со стилями выше:
каждому юзверю даем уникальный random-линк, а потом проверять по visited-свойству. получится ИД-сессии, но без «печенья». вполне занятный кроссворд, если на поиграться :)
0
pietrovich #
javascript'ом удобно привязываться к контексту конкретного посетителя а не толпы в целом. иначе в ссылке прийдется указывать и UID пользователя чтобы потом в логах отыскать… хотя если обращения будут не к статике, а к скриптам то они смогут выцепить UID из сессии/кук.
кстати скриптом можно навесить посетителю себе куку с результатами проверки чтобы не аяксить, или запускать проверку по определенному признаку, да и словари для проверки менять удобнее… в общем скрипты это хорошо, а такой способ только для ситуаций когда javascript представляется непозволительной роскошью, имхо
0
justhack #
socialhistory
0
LDEV #
Интересная концепция, но чем больше сайтов для проверки «интересов», тем выше нагрузка на клиента и собственно список сайтов «палится» на нём же.
0
Riz #
Нагрузка на клиент очень маленькая, а список не палить увы не получится, даже есл грузит его частями в зависимости от интересов, но да это и не надо. :)
0
Xeon303 #
Паранойя на мой взгляд.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.