HTTP статус-коди, виявляється, теж порушують приватність

За останні роки всі звикли до того, що справжньої анонімності та приватності в Інтернеті не досягти, якщо хочете користуватися сучасними сервісами. Англійський веб-розробник Майк Кардвел (Mike Cardwell) продемонстрував елегантний спосіб дізнатися, чи є відвідувач вашого сайта залогіненим в даний момент на іншому сайті. Майк наводить робочі приклади для Твітера, Фейсбука та Гугла.

Ідея полягає в тому, що ці сайти використовують різні коди відповіді на HTTP-запит до деяких ресурсів залежно від того, залогінені ви на їх сайті чи ні. А посилання на даний ресурс може мати атрибути OnLoad та OnError, і який з них буде викликано, залежить від коду відповіді сервера. Наприклад, Майк завантажив фото на розділ "My Picture" свого gmail-акаунту, а на своїй сторінці розмістив такий код:

<img style="display:none;"
onload="logged_in_to_gmail()"
onerror="not_logged_in_to_gmail()"
src="https://mail.google.com/mail/photos/static/AD34hIhNx1pdsCxEpo6LavSR8dYSmSi0KTM1pGxAjRio47pofmE9RH7bxPwelO8tlvpX3sbYkNfXT7HDAZJM_uf5qU2cvDJzlAWxu7-jaBPbDXAjVL8YGpI"
/>

Атрибут src вказує на це фото. Якщо відвідувач цієї сторінки є залогіненим на сервісах Google, картинка завантажиться нормально, з HTTP-кодом 200 (але завдяки style="display:none" відвідувач її не помітить). При цьому після завантаження спрацює функція, вказана в атрибуті OnLoad. Якщо ж відвідувач в даний момент не користується гугловськими сервісами, сервер у даному випадку повертає 302 (Moved Temporarily) з перенаправленням на сторінку Gmail. Відвідувач і в цьому випадку нічого не помітить, але виконається функція не OnLoad, а OnError.

Багато інших сайтів також мають ресурси, що доступні тільки для залогінених користувачів, хоча проексплуатувати це може бути складніше. Зокрема, Майк наводить код, що дає змогу дізнатися статус відвідувача у Facebook чи Twitter:

<script type="text/javascript"
src="https://twitter.com/account/use_phx?setting=false&format=text"
onload="not_logged_in_to_twitter()"
onerror="logged_in_to_twitter()"
async="async"
></script>

<script type="text/javascript"
src="https://www.facebook.com/imike3"
onload="logged_in_to_facebook()"
onerror="not_logged_in_to_facebook()"
async="async"
></script>

На цей раз використовуються посилання не на зображення, а на скрипт. Щоправда, цей код працює в Firefox та Webkit, але не працює в Opera та IE, які у випадку невдачі просто не викликають обробник OnError, якщо не було одержано валідний javascript.

Чи становить це загрозу приватності? Мабуть, невелику. В більшості випадків вас не обходить, чи знає хтось ваш статус у Гмейлі чи Твітері. З іншого боку, ви можете не бажати, щоб хтось дізнався, чи залогінені ви на Порнолабі чи якомусь опозиційному форумі. Треба просто пам'ятати, що для зацікавлених осіб ця інформація не становитиме таємниці.

коментарі:

+1tercius 07.02.2011 16:41
цікавий топік, на п’ять балів!!! хак можна навіть з користю використовувати на сайтах, знаю як. от наприклад:
типу юзаєте зара такий-то сервіс? тади ми йдемо до вас ось вам така от додаткова опція ) і в юзера круглі очі )))
tercius 07.02.2011 16:43
тільки, пардон, це не http коди винні, а розробники. гугль, твіттер, фейлбук - пофіг
і самі статус-коди ні при чім - 403 forbidden ще ніхто не скасовував

це діряві руки, не протокол
Ян Лі 08.02.2011 15:47
Фраза з мого заголовку, дійсно, тільки для заголовку й годиться. Але про криві руки не згодна. Проблема ж не в тому, что Гугль замість чесних 403 повертає 302. OnError викликалась би й на 403, й на 404, й на 200 з невірним Content-Type.

Справа, дійсно, не в протоколі. Справа в тому, що stateless від початку HTTP-протокол всі сучасні сервіси використовують не властивим для нього чином.
tercius 11.02.2011 08:50
ну, безстатевість hhtp-протоколу - це окрема і довга пісня ) як полярна ніч.. і за це його шпиняють всі, кому не ліньки ) і на кожному кроці

але все ж ваш заголовок трохи вводить людей в оману - і є більше "журналістським", ніж таким, що відповідає дійсності. еге ж? )

вся правда і заслуга автора наведеного скрипта саме у виявленні вразливостей (кривих рук та поганого налаштування) на сайтах першої інтернет-величини. саме для для Твітера, Фейсбука та Гугла. можу сміло повірити, що на "трохи менших" подібних ляпів взагалі тма-тмуща. і безконечна

але вся проблема полягає в наступному - неавторизованим користувачам свідомо віддається авторизована інформація. хоча має, по-логіці і правилам здорового глузду, відбуватися одна проста річ:

запит на авторизацію (варіант 1) або заборона доступу (варіант 2)

себто: 401/403 чи похідні. і ніяких там диверсифікованих редиректів - на чому ґугль, фейлбук і твіттер і були спіймані. от вам і вся (трохи притягнута за вуха, imho) "вразливість" http-протоколу. самі статус-коди нічого не порушують. лише їх неправильне/неграмотне використання - що і було доведено. на практиці )
tercius 07.02.2011 16:44
btw і може в цифрову безпеку? )
MFX 07.02.2011 19:47
Ян Лі, что що
ps: imike3 зараз онлайн )
Ян Лі 08.02.2011 15:48
Дякую, виправила.

додати коментар: