PL

Czego nie wiem

Uczciwie, na koniec tomu

Mój skrypt czyta dużo. Tu jest wszystko, czego nie robi nigdy, i dowód, który sprawdzisz sam.

  • Nic o Tobie nie trzymam dłużej niż 15 minut po Twoim ostatnim ruchu.
  • Nie ustawiłem żadnego ciasteczka.
  • Mój skrypt działał tylko na stronie 2.
  • Logi nie znają Twojego adresu ani słów z pola.

Czego mój skrypt nie robi nigdy

  • Nie czyta niczego przed Twoim kliknięciem. Strona 1 nie ma skryptu; rusza dopiero strona 2, którą otwiera tylko Twoje kliknięcie.
  • Nie prosi o żadne pozwolenie: kamera, mikrofon, lokalizacja, powiadomienia, odczyt schowka, czujniki ruchu, czcionki, okna, sieć lokalna.
  • Nie zostawia niczego, co przeżyje kartę: ciasteczek, localStorage, sessionStorage, IndexedDB, Cache Storage, service workerów. Przeglądarka może trzymać sam plik skryptu w pamięci podręcznej, jak każdy plik.
  • Nie skanuje Twojego komputera ani sieci: żadnych portów localhost, adresów w sieci domowej ani adresów chrome-extension://. To granica między lekcją a włamaniem (art. 267 Kodeksu karnego).
  • Nie zbiera ukradkiem: żadnych ukrytych pól na autouzupełnianie. Czyta tylko to, co sam wpiszesz albo wkleisz w pole „Napisz coś”, i to, co skopiujesz z mojej strony.
  • Nie słucha klawiszy nigdzie poza tym jednym polem i nie zapisuje rytmu Twojego pisania (odstępów między pojedynczymi klawiszami).
  • Nie rozpoznaje Cię przy następnej wizycie: bez ciasteczka i bez spisu odcisków palców. Pamięć to tom 2.
  • Nie rozmawia z nikim poza mną: żadnych CDN-ów, analityki ani cudzych serwerów STUN.
  • Nie pisze po stronie. Każde słowo i każdy obrazek, które widzisz, przyszły ode mnie, z serwera.

Dowód: dwa nagłówki

Każda odpowiedź niesie nagłówek Content-Security-Policy. Przeglądarka pilnuje go sama, nawet gdybym próbował oszukać, ale tylko tak daleko, jak sięga nagłówek: niżej mówię, gdzie się kończy, a resztę pokazuje kod.

Strona 2

jedyna ze skryptem

Content-Security-Policy: script-src 'self'; connect-src 'self'; base-uri 'none'; form-action 'none'

script-src 'self': przeglądarka uruchomi tylko skrypt z tej domeny, czyli mój. connect-src 'self': to, co skrypt wysyła przez fetch, beacony albo gniazda (WebSocket), może trafić tylko do mnie. Inne drogi wyjścia, jak wczytanie obrazka albo przeniesienie strony pod inny adres, są poza zasięgiem tego nagłówka; kod skryptu, podlinkowany niżej, pokazuje, że nie używa żadnej z nich.

Bocznych drzwi ten nagłówek nie obejmuje: przeglądarki nie stosują connect-src do WebRTC. Dlatego mówię wprost, gdzie puka mój skrypt: stun:js.watch-kube.bryzek.it:31478, mój własny serwer STUN. Sprawdzisz to w kodzie.

Strona 1, strona 3, akta i ta strona

Content-Security-Policy: script-src 'none'; base-uri 'none'; form-action 'none'

script-src 'none' zabrania wszelkich skryptów, więc przeglądarka nie uruchomiłaby ich tutaj, nawet gdybym próbował. Ten sam nagłówek mają tomy 1 i 2.

Przeczytaj skrypt: /static/watch.js Jeden plik, bez bibliotek, bez minifikacji, z komentarzami.

Co mój skrypt czyta i wysyła

Wszystko, po kolei. Czego tu nie ma, tego mój skrypt nie robi; gdyby robił, byłby to błąd.

Kiedy
Tylko na stronie 2, którą otwiera wyłącznie Twoje kliknięcie, na przykład w przycisk „Pokaż, co widzi skrypt”. Strona ładuje go asynchronicznie (async), a on czyta najwyżej przez 3 sekundy.
Zegar i języki
Strefa czasowa, ustawienia regionalne, zegar 12- czy 24-godzinny, pierwszy dzień tygodnia i języki przeglądarki. Do tego różnica między Twoim zegarem a moim: skrypt wysyła do mnie jedno zapytanie HEAD o własny plik i czyta godzinę z nagłówka Date odpowiedzi.
Karta graficzna
Producent i nazwa karty z WebGL (pełna nazwa, jeśli przeglądarka ją podaje) oraz producent i architektura z WebGPU.
Procesor i pamięć
Liczba rdzeni (hardwareConcurrency) i, jeśli przeglądarka ją podaje, pamięć (deviceMemory).
Ekrany
Rozmiar ekranu, część wolna od paska zadań albo Docka i miejsce, w którym się zaczyna, skalowanie (devicePixelRatio), drugi monitor (screen.isExtended), położenie okna i rozmiar okna strony.
Bateria
Poziom naładowania i to, czy się ładuje (odpowiadają tylko przeglądarki oparte na Chromium).
Klawiatura
Co wpisałoby dwanaście klawiszy w Twoim układzie (navigator.keyboard.getLayoutMap, tylko Chromium). Żadnego klawisza nie podsłuchuje.
Głosy
Ile głosów ma Twój komputer, w ilu językach, do dziesięciu języków i do dziesięciu nazw.
Odciski palców
Mały rysunek zrobiony w pamięci (obrazek PNG i jego skrót SHA-256) i krótki dźwięk wyrenderowany w pamięci i nigdy nieodtworzony, każde zrobione dwa razy, żeby wykryć szum, oraz kilka wyników matematyki przeglądarki.
Boczne drzwi
Kandydaci ICE, czyli linie, którymi wymieniłaby się rozmowa wideo, zebrane przy moim własnym serwerze STUN (stun:js.watch-kube.bryzek.it:31478) i wysłane dokładnie tak, jak zapisała je przeglądarka, razem z adresem, który widział mój serwer STUN. Żadne połączenie nie powstaje.
Rozszerzenia
Portfele, które odpowiadają na publiczne wołanie EIP-6963 swoją nazwą, to, czy istnieje window.ethereum, i atrybuty, które rozszerzenia same dopisują do <html> i <body> mojej strony (czytane po 2 sekundach). Niczego nie sonduje.
Ruchy
Tylko póki strona 2 jest otwarta: położenie wskaźnika (najwyżej 10 razy na sekundę), kółko (20 razy) i przewinięcie (5 razy), te trzy tylko przez pierwsze 2 minuty; kliknięcia i ich miejsce; rodzaj wskaźnika (mysz, rysik, dotyk) i najmocniejszy nacisk; nad którym z moich kadrów i jak długo zatrzymał się wskaźnik (od 1 sekundy); wyjście z karty i powrót; to, co skopiujesz z mojej strony (do 200 znaków).
Pole „Napisz coś”
To, co jest w polu, odczytywane najwyżej raz na sekundę, gdy piszesz, więc rytm pisania nie opuszcza przeglądarki, i jeszcze raz, gdy wychodzisz z karty albo ze strony lub klikasz link; i to, co do niego wkleisz. Za każdym razem do 500 znaków.
Wysyłanie
Odczyty raz, jednym zapytaniem POST; ruchy w małych paczkach, mniej więcej cztery razy na sekundę. Tylko do tej strony, z tokenem strony.
Koniec
Skrypt sam się wyłącza, gdy opuszczasz stronę 2, a najpóźniej po 10 minutach.

Co trzymam i jak długo

To, co skrypt odczytał, i wszystko, co zanotował na stronie 2, łącznie ze słowami z pola, leży pod tokenem Twojej strony. Odczyty zapisuję raz i znikają najpóźniej 15 minut po tym, jak dotarły. Notatki znikają najpóźniej 15 minut po pierwszej paczce; kolejne paczki tego nie przedłużają, niezależnie od tego, jak długo jesteś na stronie 2. Token z Twoim adresem IP i User-Agentem wygasa 15 minut po stronie 1; do tego czasu akta sprawy pokazują Ci wszystko.

Wszystko to jest tylko w pamięci mojego serwera: nic nie trafia na dysk ani do logów.

Martwe sztuczki

Dwóch sztuczek ten tom nie pokazuje, bo przeglądarki je zabiły:

Rozmiar dysku i tryb prywatny
Strony pytały przeglądarkę, ile mogą u niej zapisać, z odpowiedzi zgadywały rozmiar dysku, a z mniejszej odpowiedzi okno prywatne. Dziś Chrome podaje każdej stronie tę samą stałą wartość, około 10 GB (zmierzyłem w Chrome 156), a jego twórcy zapowiedzieli taką samą poprawkę dla trybu incognito.
Adresy w domowej sieci
Kiedyś każda strona mogła przez WebRTC odczytać adres Twojego komputera w domowej sieci. Dziś duże przeglądarki chowają go za losową nazwą kończącą się na .local albo w ogóle go nie podają. Co z tego zostało, pokazuje akt 2.

Prawdziwe przypadki

To, co mój skrypt robi jawnie, inni robili po cichu:

„No boundaries”, 2017
Badacze z Princeton znaleźli skrypty nagrywające sesje, czyli każdy ruch na stronie, na 482 z 50 000 najpopularniejszych stron, i to była dolna granica.
eBay, 2020
Według doniesień skrypt na stronie eBay sprawdzał porty localhost na komputerach odwiedzających z Windows, szukając programów do zdalnego pulpitu, podobno w walce z oszustwami. Mój skrypt nie dotyka portów Twojego komputera.
Leaky Forms, 2022
Badacze sprawdzili 100 000 najpopularniejszych stron: na 1844 (oglądanych z UE) i 2950 (z USA) adres e-mail wpisany w formularz trafiał do firm śledzących, marketingowych i analitycznych, zanim ktokolwiek kliknął „wyślij”. Skrypty nagrywające sesje zebrały hasła na 52 stronach (USENIX Security 2022).
Local Mess, 2025
Meta Pixel i Yandex Metrica na zwykłych stronach przekazywały Twoje wizyty przez localhost, czyli adres samego telefonu, aplikacjom Facebook, Instagram i aplikacjom Yandex na Androidzie, a te łączyły je z tym, kim jesteś w aplikacji. Ujawnione w czerwcu 2025 r.; Meta przestała 3 czerwca 2025 r., Yandex też; Chrome 137 zaczął to blokować.
Chrome 142, 2025
Od Chrome 142 strona, która chce zwykłymi zapytaniami sięgnąć do Twojej domowej sieci albo do samego komputera, musi najpierw zapytać Cię o zgodę. WebRTC nie jest tym jeszcze objęte. Mój skrypt o zgodę nie prosi, bo tam nie zagląda.
LinkedIn, 2026 (doniesienia)
Skrypt LinkedIna podobno sprawdza w przeglądarkach około 6000 rozszerzeń. Doniesienia z 2026 r. są sporne, a LinkedIn je kwestionuje. Mój skrypt słyszy tylko rozszerzenia, które same się przedstawiają.

Co się dzieje z danymi

Administrator
watchout.click contact@watchout.click
Cel
Pokazanie Ci, w celu edukacyjnym, co jeden skrypt na jednej stronie odczytuje o Twoim komputerze, Twojej kryjówce i Twoich ruchach. Nic więcej: żadnej analityki ani reklam.
Podstawa prawna
Odczyt Twojej przeglądarki moim skryptem: Twoje żądanie, czyli kliknięcie „Pokaż, co widzi skrypt” (art. 399 ust. 3 pkt 2 Prawa komunikacji elektronicznej: usługa, której zażądałeś). To, co skrypt odczytał i zanotował: prawnie uzasadniony interes, czyli edukacyjny cel tej strony: pokazanie Ci, co widzi jeden skrypt (art. 6 ust. 1 lit. f RODO).
Dane
To, co odczytał mój skrypt (lista wyżej); Twoje ruchy na stronie 2, łącznie z tym, co wpisałeś albo wkleiłeś w pole, i tym, co skopiowałeś z mojej strony; a w tokenie strony Twój adres IP i User-Agent.
Odbiorcy
Nikt poza mną: wszystko zostaje na moich serwerach. Mój skrypt rozmawia tylko z tą stroną i z moim własnym serwerem STUN, a ja niczego nie przekazuję dalej. Miejsce i dostawcę Twojego adresu sprawdzam w bazie na własnym serwerze, nikogo nie pytając.
Okres przechowywania
To, co skrypt odczytał: najwyżej 15 minut od chwili, gdy dotarło. To, co zanotował: najwyżej 15 minut od pierwszej paczki. Token z Twoim adresem IP i User-Agentem: 15 minut po stronie 1.
Twoje prawa
Masz prawo do dostępu do swoich danych (akta sprawy pokazują wszystko), ich usunięcia, ograniczenia przetwarzania i sprzeciwu, a także do wniesienia skargi do organu nadzorczego (w Polsce: Prezes UODO).

Dane geolokalizacyjne: IP Geolocation by DB-IP (CC BY 4.0). Czcionki: Patrick Hand i Patrick Hand SC (licencja SIL Open Font License), serwowane z tej strony.