Weryfikacja treści
ważność wysokamierzonysposób content
Obecność kluczowego tekstu na stronie. Wykrywa białe strony, podmienioną treść i błąd PHP bez kodu 500.
WIKI
artykuł z 16.09.2026 · źródeł 10Weryfikacja treści (ang. content monitoring, keyword monitoring) to parametr monitoringu stron internetowych, który pobiera stronę i sprawdza, czy odpowiedź serwera zawiera ustalony wcześniej fragment tekstu, nazywany frazą kontrolną. Pomiar kończy się jednym z trzech wyników: fraza jest, frazy nie ma albo strony nie udało się pobrać. Parametr uzupełnia sprawdzenie kodu odpowiedzi. Klasyczne wtyczki monitorujące obok listy kodów oczekiwanych w linii statusu mają osobne opcje dla napisu, który musi wystąpić w treści, dla wyrażenia regularnego, także bez rozróżniania wielkości liter, oraz dla minimalnego i maksymalnego rozmiaru strony w bajtach [1].
Jak działa
Sonda wysyła żądanie GET, odbiera całą odpowiedź i przeszukuje jej treść. Kod odpowiedzi mówi, jak serwer ocenił obsługę żądania, ale nie opisuje tego, co zobaczy odwiedzający. Google nazywa „soft 404” adres, który zwraca kod 200, a strona informuje o błędzie albo nie ma głównej treści. Wśród przyczyn wymienia brak pliku dołączanego po stronie serwera, zerwane połączenie z bazą danych, pusty wynik wyszukiwarki wewnętrznej i niezaładowany plik JavaScript [4]. Takie strony są wyłączane z wyników wyszukiwania [4].
Najprostszy wariant to wyszukanie podciągu: fraza musi wystąpić w odpowiedzi dokładnie w zapisanej postaci. Wyrażenie regularne toleruje różnice w zapisie, a dopasowanie odwrócone zgłasza błąd wtedy, gdy wzorzec się pojawi, co pozwala szukać tekstów, których na stronie być nie powinno [1]. Warunek minimalnego rozmiaru pozwala odrzucić odpowiedzi puste albo podejrzanie krótkie [1].
Sonda bez silnika przeglądarki widzi wyłącznie HTML wysłany przez serwer. W modelu „app shell” początkowy HTML nie zawiera właściwej treści, a ta powstaje dopiero po wykonaniu JavaScriptu [7]. Fraza wybrana z widoku w przeglądarce może więc nie istnieć w surowej odpowiedzi.
Standardy i specyfikacje
Weryfikacja treści nie ma własnej normy. Jest konwencją narzędzi monitorujących, a jej opcje opisuje dokumentacja tych narzędzi [1]. W praktyce stosuje się trzy metody porównania:
| Metoda | Co porównuje | Słabość |
|---|---|---|
| Fraza kontrolna | obecność napisu albo wzorca w treści [1] | nie widzi zmian w pozostałej części strony |
| Suma kontrolna strony | skrót całej odpowiedzi z wartością wzorcową | nonce zmienia się przy każdym załadowaniu strony [8] |
| Porównanie wizualne | zrzut ekranu z obrazem wzorcowym [9] | wynik zależy od systemu, przeglądarki i sprzętu [9] |
Suma kontrolna słabo pasuje do stron generowanych dynamicznie. MDN zaleca, by atrybut nonce, używany przez Content Security Policy do dopuszczania skryptów wbudowanych, był generowany inaczej przy każdym załadowaniu strony [8]. Strona z takim atrybutem nie odda więc dwóch identycznych odpowiedzi, nawet gdy nic się na niej nie zmieniło.
Porównanie wizualne w Playwright przy pierwszym uruchomieniu zapisuje zrzuty wzorcowe, a przy kolejnych porównuje z nimi nowe zrzuty biblioteką pixelmatch; opcja maxDiffPixels określa, ile pikseli może się różnić [9]. Elementy zmienne można ukryć własnym arkuszem stylów, co zwiększa powtarzalność zrzutów, a wzorce powinny powstawać w tym samym środowisku, w którym odbywa się porównanie [9].
Zagrożenia i skutki
Biały ekran. Błędy PHP i błędy bazy danych w WordPressie mogą objawiać się pustym ekranem bez żadnej informacji, nazywanym białym ekranem śmierci (WSOD). Jako przyczyny dokumentacja wskazuje wtyczkę powodującą niezgodność oraz motyw, zwłaszcza tuż po jego aktywacji [2].
Komunikat błędu w treści. Stała WP_DEBUG_DISPLAY decyduje, czy komunikaty debugowania trafiają do HTML stron; domyślnie ma wartość true, a WP_DEBUG domyślnie false. Dokumentacja nie zaleca trybu debugowania na działających witrynach [3]. Gdy jest włączony, ostrzeżenia i błędy PHP stają się częścią strony, a odpowiedź nadal może mieć kod 200. Dla sondy to obraz soft 404: sukces w kodzie, błąd w treści [4].
Defacement. MITRE ATT&CK opisuje zewnętrzny defacement (T1491.002) jako zmianę systemów dostępnych z zewnątrz, która ma przekazać komunikat, zastraszyć albo wprowadzić w błąd organizację lub użytkowników. Częstym celem są publiczne strony WWW; technikę stosują m.in. grupy haktywistów, a bywa ona wstępem do dalszych ataków [5]. Wykrywanie według MITRE obejmuje śledzenie zmian w plikach HTML, JS i CSS serwowanych przez witrynę [5]. Fraza kontrolna wykryje podmianę tylko wtedy, gdy ta usunie frazę; skrypt dopisany do strony z nienaruszoną stopką przejdzie niezauważony.
Zatruta pamięć podręczna. Web cache poisoning to technika, w której atakujący wykorzystuje zachowanie serwera i pamięci podręcznej tak, by szkodliwa odpowiedź trafiała do innych użytkowników [6]. Cache rozpoznaje żądania po kluczu, zwykle linii żądania i nagłówku Host; składniki żądania spoza klucza mogą zmienić odpowiedź serwera, a zapisana kopia jest potem wydawana wszystkim [6]. Skutkiem bywa XSS, wstrzyknięcie JavaScriptu albo otwarte przekierowanie, a atak da się zautomatyzować tak, by zatruwał cache bez końca [6]. Sonda, która pobiera stronę przez ten sam CDN co odwiedzający, widzi tę samą kopię.
Fałszywe alarmy. Frazę usuwa też zwykła przebudowa strony, a tekst dokładany JavaScriptem nie występuje w pierwotnym HTML [7]. Strona chroniona przez Cloudflare może zamiast treści oddać stronę wyzwania: pełnoekranowy ekran wyświetlany przed docelowym adresem, na którym przeglądarka musi wykonać JavaScript, zwykle w mniej niż pięć sekund [10]. Klient, który nie wykonuje JavaScriptu, zobaczy tylko ekran wyzwania, a w nim frazy nie ma.
Przykłady
| Sytuacja | Co widzi sonda | Wynik frazy |
|---|---|---|
| Błąd PHP lub bazy danych, WSOD [2] | pusta albo prawie pusta odpowiedź | brak |
| Włączone wyświetlanie błędów [3] | kod 200, komunikaty PHP w HTML | zależy od miejsca frazy |
| Zerwane połączenie z bazą danych [4] | kod 200, strona z komunikatem błędu | brak |
| Pełna podmiana strony głównej [5] | obca treść | brak |
| Dopisany skrypt, stopka bez zmian | strona z frazą i obcym kodem | jest |
| Zatruta kopia w cache [6] | szkodliwa odpowiedź z pamięci podręcznej | zależy od podmiany |
| Wyzwanie JavaScript przed stroną [10] | ekran weryfikacji zamiast treści | brak |
| Treść budowana przez JavaScript [7] | szkielet HTML bez właściwej treści | brak |
| Strona z nonce CSP [8] | odpowiedź różna przy każdym pobraniu | jest; suma kontrolna by się zmieniła |
- [1] check_http — Monitoring Plugins Manual · Monitoring Plugins
- [2] Common WordPress Errors · WordPress.org
- [3] Debugging in WordPress · WordPress.org
- [4] Troubleshoot crawling errors — soft 404 errors · Google Search Central
- [5] Defacement: External Defacement (T1491.002) · MITRE ATT&CK
- [6] Web cache poisoning · PortSwigger Web Security Academy
- [7] Understand JavaScript SEO basics · Google Search Central
- [8] nonce — HTML global attribute · MDN Web Docs
- [9] Visual comparisons · Playwright (Microsoft)
- [10] Interstitial Challenge Pages · Cloudflare
STATS
wyniki z systemu · tylko liczby zbiorcze- Stron zmierzonych
- 257w ostatnim dniu pomiaru
- OK
- 385odczytów
- Fail
- 5odczytów
- Nie dało się sprawdzić
- 93timeout, blokada, limit zapytań
- Udział fail
- 1,3%bez „nie dało się”
- Stron łącznie
- 258choć jeden odczyt
- OK
- 58980odczytów
- Fail
- 1840odczytów
- Nie dało się sprawdzić
- 10797timeout, blokada, limit zapytań
- Udział fail
- 3,0%bez „nie dało się”
| Dzień | fail | nie dało się sprawdzić | ok |
|---|---|---|---|
| 08.10.2026 | 10 odczytów | 263 odczyty | 1381 odczytów |
| 09.10.2026 | 4 odczyty | 277 odczytów | 1373 odczyty |
| 10.10.2026 | 5 odczytów | 362 odczyty | 1287 odczytów |
| 11.10.2026 | 10 odczytów | 204 odczyty | 1440 odczytów |
| 12.10.2026 | 11 odczytów | 211 odczytów | 1432 odczyty |
| 13.10.2026 | 5 odczytów | 231 odczytów | 1418 odczytów |
| 14.10.2026 | 5 odczytów | 266 odczytów | 1383 odczyty |
| 15.10.2026 | 10 odczytów | 276 odczytów | 1368 odczytów |
| 16.10.2026 | 11 odczytów | 268 odczytów | 1375 odczytów |
| 17.10.2026 | 6 odczytów | 270 odczytów | 1378 odczytów |
| 18.10.2026 | 5 odczytów | 287 odczytów | 1362 odczyty |
| 19.10.2026 | 7 odczytów | 262 odczyty | 1385 odczytów |
| 20.10.2026 | 7 odczytów | 280 odczytów | 1367 odczytów |
| 21.10.2026 | 10 odczytów | 226 odczytów | 1426 odczytów |
| 22.10.2026 | 13 odczytów | 224 odczyty | 1417 odczytów |
| 23.10.2026 | 22 odczyty | 203 odczyty | 1429 odczytów |
| 24.10.2026 | 17 odczytów | 257 odczytów | 1380 odczytów |
| 25.10.2026 | 17 odczytów | 237 odczytów | 1400 odczytów |
| 26.10.2026 | 10 odczytów | 292 odczyty | 1352 odczyty |
| 27.10.2026 | 15 odczytów | 288 odczytów | 1351 odczytów |
| 28.10.2026 | 15 odczytów | 313 odczytów | 1326 odczytów |
| 29.10.2026 | 11 odczytów | 282 odczyty | 1366 odczytów |
| 30.10.2026 | 8 odczytów | 373 odczyty | 1369 odczytów |
| 31.10.2026 | 6 odczytów | 363 odczyty | 1381 odczytów |
| 01.11.2026 | 104 odczyty | 332 odczyty | 1314 odczytów |
| 02.11.2026 | 56 odczytów | 385 odczytów | 1368 odczytów |
| 03.11.2026 | 17 odczytów | 521 odczytów | 1312 odczytów |
| 04.11.2026 | 30 odczytów | 559 odczytów | 1401 odczytów |
| 05.11.2026 | 16 odczytów | 599 odczytów | 1289 odczytów |
| 06.11.2026 | 5 odczytów | 93 odczyty | 385 odczytów |
- Otwarte teraz
- 39stron: 39 · w okresie łaski: 3
- Nowe w ostatnim dniu
- 105.11.2026
- Otwarte od początku
- 415stron: 140
- Zamknięte
- 373od początku
- Mediana trwania
- 6 h 0 minod wykrycia do zamknięcia
| Ustalenie | Skutek | Otwarte teraz | Łącznie | Zamknięte |
|---|---|---|---|---|
| Weryfikacja treści content | usterka niekrytyczna | 39 | 415 | 373 |
| Dzień | nowe ustalenia |
|---|---|
| 08.10.2026 | 1 ustalenie |
| 09.10.2026 | 0 ustaleń |
| 10.10.2026 | 1 ustalenie |
| 11.10.2026 | 5 ustaleń |
| 12.10.2026 | 5 ustaleń |
| 13.10.2026 | 1 ustalenie |
| 14.10.2026 | 1 ustalenie |
| 15.10.2026 | 4 ustalenia |
| 16.10.2026 | 5 ustaleń |
| 17.10.2026 | 0 ustaleń |
| 18.10.2026 | 0 ustaleń |
| 19.10.2026 | 2 ustalenia |
| 20.10.2026 | 1 ustalenie |
| 21.10.2026 | 2 ustalenia |
| 22.10.2026 | 0 ustaleń |
| 23.10.2026 | 6 ustaleń |
| 24.10.2026 | 0 ustaleń |
| 25.10.2026 | 5 ustaleń |
| 26.10.2026 | 0 ustaleń |
| 27.10.2026 | 4 ustalenia |
| 28.10.2026 | 4 ustalenia |
| 29.10.2026 | 1 ustalenie |
| 30.10.2026 | 1 ustalenie |
| 31.10.2026 | 0 ustaleń |
| 01.11.2026 | 3 ustalenia |
| 02.11.2026 | 1 ustalenie |
| 03.11.2026 | 1 ustalenie |
| 04.11.2026 | 7 ustaleń |
| 05.11.2026 | 1 ustalenie |
| 06.11.2026 | 0 ustaleń |
- Przebiegów
- 60sposób content
- W 30 dni
- 0przebiegów
- Ostatni
- 19.09.2026start przebiegu
- Stron w przebiegach
- 20461 przebiegów bez liczby stron
CARD
karta z kodu CREATO_PING, odczyt 22.09.2026Jak ten parametr trafia do ClickUpa: wynik sondy to linia w subtasku 2. Pomiar, a usterka, którą otwiera — linia w subtasku 1. Podsumowanie (z identyfikatorem CWE i kategorią OWASP), skąd liczy się wskaźnik zagrożenia i status strony. Projekcja z bazy skanera odświeża oba subtaski co godzinę. Do 22.09 każde ustalenie dostawało własny subtask i status ze starego słownika (PODATNA, WARNING…) — te słowa zostały jeszcze w części opisów pomiaru niżej jako język wewnętrzny sond.
| Obszar i ważność | Dostępność · wysoka (D04) |
|---|---|
| Workflow i częstotliwość | creato_ping_avail_v2 działa na LAB247Skaner 2.0, rytm „dostepnosc”: premium co 15 min, reszta co 3–12 h · Dawny workflow n8n avail_v2; od 20.09 te same sondy w rytmie kohort skanera. Sposób ssl daje odczyt ssl_expiry (dni do wygaśnięcia certyfikatu); odczyty trafiają do check_results. |
| Sonda i helper | sposób content · CREATO_PING/helpers/content_check.py |
| Testy |
|
| Typ wyniku | enum: ok / fail / timeout / nie_dalo_sie_sprawdzic (z przyczyną) + kod HTTP, fraza znaleziona (tak/nie), flaga ua_fallback |
| Jednostka | brak — wynik jakościowy (obecność frazy); czas pierwszego żądania w ms |
| Próg i reguła | Reguła: kod < 400 i fraza w treści = ok; brak frazy albo kod ≥ 400 = fail. Timeout odpowiedzi 5,0 s, połączenia 2,0 s. |
| Gdzie leżą pokrętła | CREATO_PING/helpers/config.py → TIMEOUTS["content"]CREATO_PING/helpers/common.py → BLOCK_LIKE_STATUSESCREATO_PING/helpers/site_params.py → CRITICAL_CHECK_TYPES (content poza listą)expected_content_string per strona — w opisie zadania strony w ClickUp |
| Retencja odczytów | Surowy pomiar jako NIEZMIENNY wiersz tabeli `odczyty` w bazie skanera (wejście, wyjście, dowody, sha karty sondy i helpera, commit kodu) — trigger odrzuca każdą zmianę. Okno retencji z kohorty: 90 dni premium, 30 dni reszta; poza oknem zostają odczyty z werdyktem problemu, akcją albo etykietą, bo replay reguł ich potrzebuje (`skaner/retencja.py`). Spłaszczony wynik jedzie dodatkowo do tabeli `check_results` bazy LAB247 (skrzynka `state/checks_outbox` → timer co 10 min); tej tabeli kod LAB247 nie czyści. |
| Znane rozbieżności |
|
| Karta przepisana z | CREATO_PING/helpers/content_check.py · CREATO_PING/helpers/common.py · CREATO_PING/helpers/config.py · CREATO_PING/helpers/site_params.py · CREATO_PING/helpers/availability_recheck.py · CREATO_PING/tools/avail_writer_input.py · CREATO_PING/skaner/usterki.toml · CREATO_PING/skaner/ocena.py · odczyt 22.09.2026 |
content: bramka polityki otwarta (gate=true) → sprawa w skanerze → Umówiona treść zniknęła ze strony — waga 3 → ocena 5–6 (żółty), status strony „sredni”, dopóki sprawa jest otwarta. Okres łaski: 1. porażka zakłada sprawę ze statusem IN PROGRESS, której wskaźnik NIE liczy (`ocena.py` pomija sprawy niepotwierdzone), 2. porażka z rzędu potwierdza sprawę i dopiero wtedy usterka wchodzi do oceny. Pierwszy odczyt ok zamyka sprawę. Od 17.09 blokada, której nie przechodzi też UA przeglądarki (403, 406, 415, 451, 429), nie jest porażką, tylko trzecim stanem `nie_dalo_sie_sprawdzic` z przyczyną `blokada` albo `limit_zapytan`: sprawa nie powstaje i żadna otwarta się nie zamyka — treści nie widzieliśmy.
| Kod | Finding | Severity | Pewność | Skutek | Finding / alarm | Waga → ocena | Co zrobić |
|---|---|---|---|---|---|---|---|
| D04.01 | Weryfikacja treścicontent | Średnia | Ewidentne | usterka niekrytyczna | tak / nie | waga 3 → ocena 5–6 (żółty) | Sprawdź, czy strona nie wyświetla pustej treści lub błędu PHP. |
| Kod i klucz | D04.01 · content · w tabeli typów |
|---|---|
| Co znaczy | Strona ładuje się, ale brakuje oczekiwanego fragmentu (np. nazwy firmy w stopce). |
| Kiedy powstaje | GET strony i sprawdzenie, czy expected_content_string występuje w odpowiedzi (podciąg, wielkość liter ma znaczenie). Status fail, gdy fragmentu brak albo kod ≥ 400. Status nie_dalo_sie_sprawdzic, gdy kod 403/406/415/429/451 utrzymuje się po ponowieniu z UA przeglądarki. Timeout po 5,5 s.Pusty expected_content_string daje fail „is empty”, którego flatten nie raportuje (avail_writer_input.py:77). |
| Severity · pewność | Średnia · Ewidentne |
| Skutek dla strony | usterka niekrytyczna · zakłada Finding · alarm nie |
| Waga → ocena | waga 3 → ocena 5–6 (żółty) |
| Klasyfikacja | MITRE ATT&CK 19.2: T1491.002 Defacement: External Defacement (ślad)OCSF 1.9.0: poza klasami Findingu |
| Rekord OCSF | finding_info.analytic.uid = "D04.01" · analytic.name = "content" · finding_info.types = ["D04 Weryfikacja treści"] |
| Co zrobić | Sprawdź, czy strona nie wyświetla pustej treści lub błędu PHP. |
| Wersje typu |
|
LOOP
pętli: 1Trafności jeszcze nie liczymy: zamknięcie subtaska nie niesie dziś werdyktu (prawdziwy / fałszywy / nie dało się sprawdzić). Cztery liczby pojawią się, gdy każde zamknięcie dostanie werdykt — to warunek startu pętli 1.
Sygnał: Strony za WAF-em albo wtyczką bezpieczeństwa zwracały sondzie 403/429, a działały dla ludzi — fałszywe DOWN. · dotyczy też: Kod odpowiedzi HTTP, Przekierowanie HTTP → HTTPS
- 1. Zbiórkaręcznieodczyt z nocnego skanu, bez zapisu per strona
- 2. Werdyktręcznieczłowiek potwierdził, że strona działa w przeglądarce
- 3. Miarabrakliczników trafności wtedy nie było
- 4. Kartabrakkarta parametru powstała 2026-09-16
- 5. Zmianazrobionedruga próba z UA przeglądarki
- 6. Replaybrakbrak zapisanych odczytów do replayu
| Data | Zmiana | Powód | Wpływ na system | Commit · replay |
|---|---|---|---|---|
| 2026-07-19 | Przy kodzie 403, 406, 415, 429 albo 451 sprawdzenie ponawia żądanie z UA przeglądarki; 2xx/3xx za drugim razem = ok (w przekierowaniu: adres końcowy na https).helpers/common.py · helpers/http_check.py · helpers/content_check.py · helpers/redirect_check.py | Blokada robotów na poziomie aplikacji nie jest niedostępnością strony. | cały system Ta sama reguła obowiązuje w weryfikacji treści — oba sprawdzenia czytają BLOCK_LIKE_STATUSES z common.py. | 343b699bez replayubez zapisu zatwierdzenia |