Połowa strony się renderuje, jeden arkusz stylów jest wyszarzony w panelu Sieć, a klient VPN nadal raportuje zdrowy tunel. Wszystkie trzy obserwacje są prawdziwe naraz, bo przeglądarka oceniła żądanie wykonane przez stronę, a tunel nie miał głosu w tym osądzie. Sprawę zamyka decyzja, a nie ustawienie: napraw odwołanie, eskaluj je do właściciela hosta albo porzuć zależność. Każda z tych opcji ma tani test, a wybór złej kosztuje cykl wsparcia.

Dlaczego tunel nie może objąć zasobu podrzędnego

Treści mieszane zaczynają się od dokumentu HTTPS, który prosi o zasób podrzędny przez zwykły HTTP. Każdy adres URL jest oceniany według własnego schematu, więc ochrona dokumentu nadrzędnego nigdy nie rozciąga się na żądanie podrzędne. Szyfrowanie dodane poniżej przeglądarki zmienia to, co idzie przez sieć, a nie http://, o które prosił znacznik.

Obecne przeglądarki dzielą te żądania na dwie grupy i traktują je różnie. Skrypty, arkusze stylów, iframe'y i wywołania przez fetch, XMLHttpRequest lub WebSocket są odrzucane od razu, bez wcześniejszej próby uaktualnienia. Obrazy, dźwięk i wideo są przepisywane na https:// i ponawiane, a ładowanie jest przerywane, gdy to bezpieczne pobranie zawiedzie. Adres URL zasobu podrzędnego, którego hostem jest goły adres IP, jest wyłączony z uaktualniania, więc obraz HTTP na hoście IP pozostaje zablokowany zamiast zostać po cichu naprawiony. Podział, łącznie z tym wyjątkiem po stronie uaktualnialnej, jest udokumentowany w przewodniku Mozilli po treściach mieszanych. Chrome stosuje podobną odmowę wobec niezabezpieczonych pobrań rozpoczętych z bezpiecznej strony, dlatego link do PDF może umrzeć, podczas gdy otaczająca strona wygląda na nietkniętą.

Wyszarzony wiersz jest więc dowodem, że kontrola działa, a nie dowodem, że tunel przepuścił jawny tekst. Traktuj wiersz jako znalezisko wskazujące jedno odwołanie, a nie całą stronę.

Ustal, do kogo należy niezabezpieczone odwołanie

Posortuj sporny adres URL według miejsca, w którym powstaje, zanim cokolwiek zmienisz. Ta odpowiedź decyduje, czy możesz dziś wdrożyć poprawkę, czy dostawca musi wydać własną, czy zależność musi opuścić stronę. Odczytaj ją z kolumny Inicjator w panelu Sieć, bo znacznik na ekranie jest często składany w czasie działania.

Skąd pochodzi adres URLKto może go naprawićPierwszy krok
Zakodowany na twardo w szablonie lub fragmencie, który wdrażaszTyZastąp go formą https:// i wyczyść pamięć podręczną
Wstrzyknięty przez menedżera tagów lub pakiet dostawcyDostawca, z twoim zgłoszeniemWyślij dokładny adres URL, typ żądania i wiersz konsoli
Serwowany tylko na porcie 80 bez nasłuchu TLSWłaściciel hostaPoproś o TLS, postaw przed nim coś, co kontrolujesz, albo go porzuć

Gdy host już odpowiada na 443 i tylko odwołanie mówi http, naprawa jest lokalna: zmień odwołanie, wyczyść pamięć podręczną strony i potwierdź, że wiersz zmienia się na https. Hosta, który nasłuchuje tylko na porcie 80, nie da się doprowadzić do zgodności edycją, więc zasób się przenosi, zostaje postawiony za czymś, co kontrolujesz, albo znika. Adres URL wstrzyknięty przez menedżera tagów nadal się pojawia, nawet gdy twój szablon jest czysty, a ten przypadek należy do zgłoszenia z dokładnym adresem URL i wierszem konsoli w załączniku. Kazać personelowi zezwalać na niezabezpieczone treści to nie jest żadna z tych opcji, bo wyłącza kontrolę dla każdej witryny, którą odwiedza ten profil przeglądarki.

Napraw odwołanie, a nie ustawienie przeglądarki

Przeładuj zawodny przepływ z zachowanym dziennikiem sieci i przefiltruj panel po podejrzanym hoście. Konsola wskazuje adres URL i dyrektywę, co rozstrzyga, czy żądanie zostało odrzucone, czy uaktualnione, zanim dotkniesz szablonu.

curl -sSI https://cdn.example.org/vendor.js | head -n 1
curl -sS -o /dev/null -w '%{http_code} %{url_effective}\n' -L https://cdn.example.org/vendor.js

Warto znać dwie kontrole pomocnicze i żadna nie zastępuje naprawy. Nagłówek Content-Security-Policy z upgrade-insecure-requests powoduje, że przeglądarka przepisuje adresy URL zasobów podrzędnych http, zanim opuszczą stronę, co łapie stare odwołania, których jeszcze nie znalazłeś. Przepisane żądanie nadal zawodzi, gdy docelowy host nie serwuje HTTPS, więc nagłówek zmienia tylko to, którego adresu URL próbuje przeglądarka. HSTS działa na host, co oznacza, że polityka w twojej własnej domenie nic nie robi dla CDN-u strony trzeciej, który nigdy nie wysłał nagłówka. Po zmianie szablonu wyczyść pamięć podręczną strony i poszukaj starej nazwy hosta w wyrenderowanym HTML-u, bo ten sam adres URL może też przyjść przez fragment, ciąg tłumaczenia lub pole bazy danych.

Śledź też przekierowania, bo łańcuch zaczynający się na https:// może wylądować w lokalizacji http://, a przeglądarka ocenia ostatni skok. Forma -L drugiego polecenia powyżej wypisuje ten efektywny adres URL za ciebie. Jeśli ostatni skok to czysty http, odwołanie nadal jest błędne, nawet jeśli edytowany link wyglądał dobrze.

Potwierdź stronę konsolą i panelem sieci

Przeładuj z wyłączoną pamięcią podręczną i przejdź przepływ ponownie, łącznie z przyciskami, które wczytują treści na żądanie. Pierwsze wczytanie strony ukrywa leniwe widżety, kafelki mapy i skrypty odtwarzacza, które pojawiają się dopiero po kliknięciu. Konsola nie powinna zawierać wpisów o treściach mieszanych, a każdy wiersz, którego dotknąłeś, powinien pokazywać https. Zrób zrzut konsoli i wiersza żądania przed zamknięciem zgłoszenia, bo ten stan trudno odtworzyć po następnym wdrożeniu.

Gdy zasób należy do kogoś innego, wyślij cztery rzeczy: dokładny adres URL, typ żądania, tekst konsoli i stronę, na której się pojawia. Ukryj identyfikatory sesji we wszystkim, co wklejasz do zgłoszenia. Raport, który mówi tylko, że obrazy są zepsute, nie daje właścicielowi niczego do wyszukania.

Tunel nadal robi swoje, podczas gdy poprawka leży w odwołaniu, które wytworzyło żądanie. Po wdrożeniu poszukaj jeszcze raz nazwy hosta w szablonie i pakiecie dostawcy, a sprawę zamknij dopiero wtedy, gdy w konsoli nie zostanie żaden zablokowany wpis o treściach mieszanych.

Powiązane artykuły