Opakovaný bezpečnostní a obsahový audit

Audit webu www.mnohocetnymyelom.cz po opravě dodavatelem

Akceptační protokol DFMG uvádí, že „při akceptaci nebyly zjištěny závady". Tento nezávislý re‑audit zjišťuje opak — a nachází i čtyři zcela nová, závažná zjištění, včetně veřejně stažitelných záloh webu s živým heslem do databáze.

Datum auditu
20. 8. 2026
Výchozí stav
Audit z 31. 3. – 10. 4. 2026 (čtyři kola)
Podnět
Akceptační protokol DFMG (Digital First Marketing Group s.r.o.) pro Janssen‑Cilag s.r.o., „Oprava částí webu mnohocetnymyelom.cz"
Metoda
Výhradně jen pro čtení — na webu pouze GET/HEAD, na serveru jen čtení a SELECT/SHOW dotazy. Nic nebylo změněno, nainstalováno ani staženo. Prověřeno 1 070 URL, 159 souborů a 49 externích odkazů; většina nálezů prošla druhým nezávislým ověřovacím kolem.

0 · Shrnutí

Oprava proběhla jen částečně — a přidala nové problémy

Z 21 hlavních zjištění dubnového auditu je 7 prokazatelně opraveno, 9 opraveno jen částečně a 5 zůstává beze změny. Audit navíc odhalil 4 zcela nová, závažná zjištění — nejzávažnější je, že na webu jsou veřejně stažitelné čtyři úplné zálohy celého webu (1,3 GB) včetně živého hesla do databáze a 97 zpráv z formulářů, a že server sám servíruje záložní wp-config.php s aktuálním heslem jako čistý text.

1
kritický nález
9
vysoce závažných
11
středně závažných
16
nízkých / informativních

Zároveň je namístě korektně ocenit, co agentura skutečně opravila — viz kapitolu 4. Jde o reálný, ověřitelný posun (kontaktní formulář už nechodí vývojáři, výčet uživatelů přes REST API je uzavřen, sitemapa funguje, elektronická přihláška je konečně v menu). Problém je v rozsahu a hloubce opravy, ne v tom, že by se nic nedělo.

1 · Hodnocení akceptačního protokolu

Sedm bodů protokolu — stav ke dni auditu

1Kontrola a zabezpečení webu vč. bezpečnostního pluginuČástečně

Wordfence je nainstalován, základní WAF běží. Ale záložní wp-config.php je originem servírován jako čistý text, čtyři úplné zálohy webu jsou veřejně stažitelné s živým heslem do DB, WP‑cron nikdy neběží, chybí 2FA i rate‑limiting a origin nemá vlastní TLS.

2Oprava formulářů a el. přihlášky, e‑mail příjemce, doručování mimo spamČástečně

Příjemce je správně opraven na koordinatorka@mnohocetnymyelom.cz, SPF/DKIM/DMARC nastaveny. Ale el. přihláška posílá skrytou kopii osobních údajů žadatelů agentuře, povinný souhlas odkazuje na neexistující PDF a SMTP má vypnuté ověřování TLS certifikátu.

3Kontrola uživatelských účtů, odstranění nepotřebnýchZ větší části splněno

Počet uživatelů klesl z 11 na 5. Zbývá: 4 z 5 účtů mají roli administrátora, nikdo nemá 2FA a admin_email stále patří bývalému vývojáři mimo firmu.

4SEO — title/description, auto‑načítání z obsahu, přesměrování starých URLZ podstatné části nesplněno

Meta popisek je identický na všech 534 stránkách. rel=canonical a og:url na 89 stránkách míří na cizí, nefunkční vývojářskou doménu. 315 starých URL vrací 404 bez přesměrování; 88 „funkčních" přesměrování vzniká jen náhodným dohadem WordPressu, ne nastaveným pravidlem.

5Zobrazování příspěvků, kategorie, archiv a filtryČástečně, s vedlejšími škodami

Hromadné převedení 431 příspěvků na koncept 17. 6. 2026 „skrylo" nepotřebné, ale rozbilo odkazy, které na ně stále vedou, a přerušilo staré URL bez náhrady. Žádný uspořádaný archiv/filtr nevznikl — 41 URL kategorií dodnes existuje jako prázdná stránka.

6Zobrazování stránek, skrytí nepotřebnýchČástečně

56 stránek správně v koši, dubnové „prázdné stránky" dnes přesměrovávají. Ale /klinicke-studie/ a dalších 40 adres na kořenové úrovni stále existuje jako prázdný archiv kategorie — stejná příčina jako v dubnu, jen s vyprázdněným obsahem místo skutečné opravy.

7Oprava chybně zobrazených a prázdných stránekČástečně

Tři dubnové případy jsou přesměrovány pryč. Nově ale 78 z 322 stránek (24 %) nemá použitelný nadpis H1 a existuje 10 nefunkčních odkazů z živých stránek — 2 z nich vznikly přímo jako vedlejší škoda bodu 5.

Závěr: tvrzení „nebyly zjištěny závady" neodpovídá zjištěnému stavu. Doporučujeme protokol nepodepisovat v předložené podobě, případně jej podepsat s přiloženým seznamem vad (formulář na str. 2 na to má připravenou tabulku) a stanovit agentuře termín k jejich odstranění — zejména bezpečnostní expozice dat (2A) a ochrany osobních údajů, které mají naléhavost v řádu dnů.

2A · Nálezy — kritická a vysoká závažnost

Kritický nález

Kritická

K1 — Server sám servíruje záložní wp‑config.php s živým heslem do databáze jako čistý text

/srv/www/wordpress/wp-config.php.bak-20260527-1046 · vytvořen 27. 5. 2026 při nastavování SFTP pro agenturu

Heslo do databáze a všech 8 bezpečnostních klíčů/solí v tomto záložním souboru je shodné s aktuálním živým wp-config.php. Požadavek přímo na origin server (obchází Cloudflare) na tento soubor vrací HTTP 200 a obsah v čistém textu. Zvenčí je adresa dnes blokována jen díky jednomu pravidlu na Cloudflare — ne díky konfiguraci serveru. Kdyby pravidlo zmizelo, aktuální heslo do databáze by bylo okamžitě veřejně dostupné.

Doporučení: okamžitě smazat soubor ze serveru; přidat na úrovni Apache virtuálního hostu (ne .htaccess) pravidlo blokující wp-config.php*, *.bak, *.sql, *.old, *.orig v celém wp-content. Z opatrnosti rotovat heslo do databáze a bezpečnostní klíče/soli.

Vysoká závažnost

Vysoká

V1 — Čtyři úplné zálohy webu (1,3 GB) stažitelné z internetu, obsahují živé heslo do DB a 97 zpráv z formulářů

/wp-content/backups-dup-lite/ (Duplicator Lite 1.5.16) · archivy z 13. 4., 30. 4., 9. 6. a 11. 6. 2026, 323–343 MB

Každý ze čtyř *_archive.zip odpovídá zvenčí (přes Cloudflare) HTTP 200 včetně přenosu obsahu; Cloudflare je navíc po prvním stažení cachuje na hraně sítě (~2 h). Jedinou ochranou je 20znakový náhodný hash v názvu souboru. Výpis obsahu potvrzuje kompletní zálohu databáze (71 tabulek) včetně uživatelů, 97 záznamů z formulářů (osobní údaje pacientů?), zbytků API klíčů a záložního wp-config.php se stejným heslem jako K1.

Doporučení: smazat všechny 4 zálohy i .log/.bak soubory, vyčistit Cloudflare cache, zablokovat *.zip/*.sql/*.log/*.bak pod wp-content. Z opatrnosti rotovat heslo do MariaDB, zneplatnit SendGrid klíč, zvážit posouzení dle GDPR čl. 33/34 vzhledem ke 97 uloženým zprávám s osobními údaji.

Vysoká

V2 — Plánované úlohy WordPressu (WP‑cron) na tomto serveru nikdy neproběhly

Cloudflare blokuje vlastní pokus originu spustit cron sám na sebe bezpečnostní výzvou

Za 14 dní záznamů v přístupovém logu neproběhl ani jeden požadavek na wp-cron.php. Neběží plánované skeny Wordfence, kontroly aktualizací ani čištění databáze — bezpečnostní plugin tak fakticky „spí".

Doporučení: vypnout spouštění cronu přes web (DISABLE_WP_CRON) a nahradit systémovým plánovačem, který spustí wp-cron.php každých 5 minut lokálně na serveru.

Vysoká

V3 — Adresa admin_email patří bývalému vývojáři agentury, který už není uživatelem webu

admin_email = ondrej@jadrny.com — mezi dnešními 5 uživateli není

Na tuto adresu chodí veškerá systémová upozornění WordPressu i případný proces obnovy hesla administrátora.

Doporučení: změnit na adresu, kterou skutečně sleduje klub (např. koordinátorka); doplnit vlastníka do příjemců upozornění Wordfence (dnes tam je jen agentura).

Vysoká

V4 — Bezpečnostní plugin Wordfence je nastaven jen napůl

wp_wfconfig, wp_wfls_settings

Základní firewall běží, ale rozšířená ochrana (běh na úrovni PHP před načtením WordPressu) není zapnuta, omezení počtu požadavků je vypnuté a dvoufaktorové ověření není vyžadováno ani zapnuté u žádného ze 4 administrátorských účtů. Poslední kompletní sken proběhl jen díky ručnímu spuštění v rámci tohoto auditu.

Doporučení: zapnout rozšířenou ochranu, rate limiting a povinné 2FA pro administrátory; opravit WP‑cron (V3), aby skeny běžely samy.
Ale nejsem si jisty, jak jsme se na tomto nakonec domluvili.

Vysoká

V5 — canonical a og:url na 89 stránkách míří na cizí, nedůvěryhodnou vývojářskou doménu kpmm.upnet.cz

wp_yoast_indexable — 115 z 808 záznamů se „zamrzlou" adresou z 22. 3. 2025

Doména kpmm.upnet.cz skutečně existuje a odpovídá, ale je to pracovní instance s expirovaným TLS certifikátem, ne skutečný web. Kořenová příčina: Yoast SEO má u části stránek uloženou adresu z doby před spuštěním na ostré doméně a od spuštění nikdy neproběhla úplná reindexace. Google tyto stránky vnímá jako kopii obsahu z jiné, nefunkční domény; sdílení na sociálních sítích u nich může vést na špatnou adresu.

Doporučení: ve Yoast SEO spustit „Obnovit indexovatelné položky", případně cíleně přepočítat záznamy s permalink LIKE '%upnet%'; ověřit vzorek stránek po opravě.

Vysoká

V6 — V databázi zůstaly zapomenuté přihlašovací údaje k nepoužívaným e‑mailovým službám

wp_options → wp_mail_smtp (plugin už není nainstalován)

Volba obsahuje kompletní přístupové údaje ke Gmail SMTP účtu a funkční API klíč k SendGridu — ačkoliv plugin, který je vytvořil, na webu už není. DNS záznamy pro SendGrid stále existují, i když poštu dnes odesílá jiná služba (Mailjet).

Doporučení: zneplatnit SendGrid klíč, zrušit heslo aplikace pro Gmail, smazat příslušné položky z databáze a odstranit nepoužívané DNS záznamy SendGridu.

Vysoká

V7 — Přihlášky z formuláře Elektronická přihláška se ukládají natrvalo bez odpovídajícího souhlasu na /gdpr/

plugin CFDB7 · /gdpr/

Plugin uchovává všechny odeslané zprávy z obou formulářů bez automatického mazání (105 záznamů u kontaktního formuláře od března 2025), přístupné jakémukoliv administrátorovi vč. agentury. Stránka /gdpr/ slibuje uchování 1 rok a nezmiňuje formulář elektronické přihlášky (jméno, datum narození, adresa, telefon) vůbec.

Doporučení: zvážit, zda je databázové úložiště nutné (pošta už chodí koordinátorce); pokud ano, nastavit automatické mazání a doplnit /gdpr/ o skutečný rozsah zpracování dat z el. přihlášky.

2B · Nálezy

Střední závažnost

Střední

S1 — Kopie osobních údajů žadatelů o členství chodí agentuře

Formulář „Elektronická přihláška" má v nastavení e‑mailu skrytou kopii (Bcc) na adam.reznicek@dfmg.cz — posílá se tak jméno, datum narození, adresa a telefon žadatele. Zatím jen 2 odeslání (patrně testovací), ale nastaveno napevno od 29. 6. 2026.

Doporučení: smazat řádek Bcc v nastavení formuláře; klient by měl zároveň doplnit /gdpr/, kdo všechno má k datům přístup.

Střední

S2 — Odesílání e‑mailů má vypnuté ověřování TLS certifikátu protistrany

Plugin SMTP Mailer (Mailjet) má zaškrtnuto „Disable SSL Certificate Verification" — zbytečně, certifikát Mailjetu je platný. Riziko odposlechu/podvržení spojení.

Doporučení: zrušit zaškrtnutí, otestovat odeslání zprávy, aktualizovat plugin na 1.1.26.

Střední

S3 — Povinný souhlas v el. přihlášce odkazuje na neexistující (404) PDF stanov

Odkaz vede na starou cestu z roku 2014, soubor je dnes uložen jinde. Žadatel musí zaškrtnout, že si přečetl dokument, který nejde otevřít.

Doporučení: opravit odkaz na aktuální znění stanov (14. 10. 2023), otevírat v novém okně.

Střední

S4 — Meta popisek je identický na všech 534 stránkách

Šablona kpmm (kód upravený agenturou 24. 6. 2026) vynucuje název webu jako popisek na každé stránce místo skutečného obsahu — bod 4 protokolu („automatické načítání description z obsahu") tak není naplněn.

Doporučení: upravit šablonu, aby popisek odvozovala z obsahu stránky; doplnit ručně popisky alespoň u 30 nejdůležitějších stránek.

Střední

S5 — 315 starých URL adres příspěvků vrací 404 bez přesměrování

Souvisí s hromadným převedením 431 příspěvků na koncept 17. 6. 2026. Funkčních 88 přesměrování je jen náhodných (WordPress hádá podobný název), ne nastavených pravidel — při další úpravě přestanou fungovat.

Doporučení: vytvořit skutečný seznam přesměrování (6 duplicit má ekvivalentní stránku, 97 „info odpolední" na archiv akcí, 41 bulletinů na archiv publikací, zbytek vrátit jako obsah nebo HTTP 410).

Střední

S6 — 41 adres kategorií na kořenové úrovni existuje jako prázdné stránky (HTTP 200)

Např. /klinicke-studie/, /radioterapie/, /leky/, /lecba/. Šablona registruje pro každou kategorii vlastní adresu, která vždy „vyhraje" nad stránkou stejného jména; obsah je dnes prázdný, protože všechny příspěvky jsou koncept. Stejná příčina jako dubnový nález, jen s vyprázdněným obsahem místo skutečné opravy.

Doporučení: zrušit v šabloně automatickou registraci kategorie na kořenové URL, nastavit přesměrování ze 41 adres na odpovídající novou stránku.

Střední

S7 — 10 nefunkčních odkazů na živých stránkách (18 výskytů)

Nejzávažnější: povinná příloha v el. přihlášce (S3); dále 6 PDF s účetními závěrkami a zápisy ze schůzí, odkaz „Pokračování" na stránce se seznamem členských schůzí, PDF organizační struktury, které už na serveru neexistuje.

Doporučení: viz příloha 03_nefunkcni-interni-odkazy.csv; opravy jsou většinou jen úpravou odkazu v textu stránky (cca 30 min práce).

Střední

S8 — Historická mediální knihovna (2014–2024) nebyla při přechodu na nový web migrována

Na serveru dnes existují jen složky uploads/2025/ a uploads/2026/. Databáze eviduje 151 příloh z let 2014–2024, jejichž soubory na disku chybí. 122 odkazů vede na 404, z toho 45 lze snadno opravit (soubor nahrán znovu pod jiným umístěním), zbylých 77 se nepodařilo dohledat ani v zálohách.

Doporučení: u dohledatelných 45 přesměrovat staré cesty na nové; u zbylých 77 zjistit u klubu, zda dokumenty ještě existují jinde.

Střední

S9 — Web neposílá žadateli o členství žádné potvrzení

Automatická odpověď je v nastavení formuláře vypnutá; neaktivní šablona navíc obsahuje zastaralé údaje (soukromý e‑mail majitele, vývojářskou adresu localhost).

Doporučení: zapnout potvrzovací e‑mail s platebními údaji, bez opisování citlivých údajů (datum narození, adresa) do potvrzení.

Střední

S10 — Zastaralé pluginy a jádro WordPress

Wordfence 8.2.2 (aktuální 9.0.0), Yoast SEO 27.6 (28.3), Contact Form 7 6.1.5 (6.1.7), CFDB7 1.3.5 (1.4.0), UpdraftPlus, Cookie Law Info, Google Site Kit a další pozadu; jádro WordPress 6.9.4 (aktuální řada 7.1). Automatické aktualizace jsou vypnuté. U pluginu wp-file-manager (8.0.4, aktuální) jsme ověřili, že opravuje kritickou zranitelnost starších verzí — instalace není zranitelná, ale plugin se nevyužívá a doporučujeme jej odinstalovat.

Doporučení: aktualizovat všechny pluginy a jádro po zálohování (V2); zavést měsíční kontrolu aktualizací.

Střední

S11 — Konfigurace CORS na /wp-json/ odráží libovolnou doménu a povoluje přenos cookies

Toto není výchozí chování jádra WordPressu — zdroj (plugin/pravidlo) se v čase auditu nepodařilo dohledat. Riziko: cizí web by mohl za určitých okolností číst odpovědi REST API jménem přihlášeného uživatele.

Doporučení: dohledat zdroj a omezit Allow-Origin na vlastní doménu, nebo vypnout Allow-Credentials.

2C · Nálezy

Nízká závažnost a informativní zjištění

N1Chybí bezpečnostní HTTP hlavičky (HSTS, X‑Frame‑Options, CSP, X‑Content‑Type‑Options, Referrer‑Policy) na hlavních stránkách — Apache nemá načtený modul mod_headers. Přihlašovací stránka je částečně chráněná, zbytek webu ne.
N2XML‑RPC rozhraní zůstává povoleno ve Wordfence, ačkoliv se nevyužívá.
N3Diagnostický skript agentury zůstal na serveru (diag-cache.php), chráněný jen dvouznakovým „heslem" v adrese; sám obsahuje komentář „po přečtení soubor SMAŽ". Doporučujeme smazat.
N4Interní chyba pluginu cf7‑antispam — dotazuje se na neexistující databázovou tabulku, ochrana proti spamu tak částečně neběží. Řešení: znovu aktivovat plugin.
N578 z 322 živých stránek (24 %) nemá použitelný nadpis H1 — buď zcela chybí (33), nebo je prázdný (45, většinou na prázdných archivech kategorií ze S6). Dopad na SEO malý, pro čtecí zařízení (nevidomí) reálná překážka.
N6Tři řetězce přesměrování o dvou skocích beze změny od dubna (/klub/, /o-nemoci/, /pro-pacienty/) — mimo hlavní menu, ale v sitemapě.
N7Náhledový obrázek pro sdílení (og:image) chybí na 530 z 534 stránek.
N8Každá novinka má tři fungující URL adresy — nezpůsobuje duplicitní obsah pro Google, ale je to zbytečné a matoucí.
N9Výkon webu je v pořádku — doba odezvy serveru 270–340 ms, HTTP/2 funguje, statické soubory Cloudflare cachuje. Toto není problém.
N10TLS certifikát je platný do 19. 10. 2026, žádná akce nutná v nejbližší době.

Většina výše uvedených zjištění (zejména S4–S9, N6, N8, V1, V2 a čtyři nálezy u formulářů) prošla druhým, nezávislým ověřovacím kolem, jehož úkolem bylo nález vyvrátit nebo zpřesnit — u několika to snížilo původně odhadovanou závažnost. Zjištění K1, V3–V9 a S10–S11 pocházejí z jednoho důkladného průchodu s konkrétními, opakovatelnými důkazy, ale bez druhého nezávislého kola kvůli časovému omezení; doporučujeme je považovat za vysoce důvěryhodné, byť ne stoprocentně kontraadversariálně prověřené.

4 · V zájmu korektnosti vůči dodavateli

Co bylo prokazatelně opraveno

  • Kontaktní formulář i elektronická přihláška se vykreslují kompletně, včetně skrytých CF7 polí a ochrany proti spamu.
  • Příjemce obou formulářů je opraven na koordinátorku klubu — dubnový nález (zprávy chodily vývojáři agentury) je vyřešen.
  • Ochrana proti výčtu uživatelů přes REST API je uzavřena.
  • XML sitemapa funguje (dříve vracela přesměrování do prázdna).
  • Open Graph značky a strukturovaná data (JSON‑LD) jsou nyní na všech stránkách.
  • Rozbitý newsletter formulář byl odstraněn místo cinknuté opravy.
  • Elektronická přihláška je konečně dostupná — v dubnu vedl odkaz do koše, dnes je v hlavním menu a funguje.
  • Počet uživatelských účtů klesl z 11 na 5, rizikové účty byly odstraněny.
  • Práva souboru wp-config.php byla zpřísněna ze 664 na 640.
  • Nebyly nalezeny žádné stopy napadení webu — žádný podezřelý kód, karanténní soubory z května se nevrátily.
  • SPF, DKIM a DMARC pro odesílání pošty jsou správně nastaveny pro aktuální službu.
  • Zabezpečení SSH přístupu je na dobré úrovni — žádné přihlašování heslem, fail2ban aktivní.
  • Dubnová chyba filemtime() ve skriptu šablony byla opravena.

Přílohy

Datové podklady (složka data/)

📥 Stáhnout data jako ZIP archiv

SouborObsah
01_canonical_kpmm-upnet.csv89 stránek, jejichž rel=canonical / og:url ukazuje na kpmm.upnet.cz
02_stare-url_duben-vs-srpen.csvvšech 725 URL z dubnového auditu — stav v dubnu vs. dnes
03_nefunkcni-interni-odkazy.csvnefunkční odkazy z živých stránek (cíl, stav, zdrojové stránky)
04_chybejici-soubory-mapovani.csv122 chybějících souborů v uploads/ a zda existují pod novou cestou
05_externi-odkazy.csv49 externích odkazů a jejich stav
06_vsechny-url_stav.csvkompletní výstup procházení (1 070 URL)
07_prazdne-archivy-kategorii.csvarchivy kategorií vracející 200 bez jediného příspěvku

V tomto dokumentu ani v přílohách nejsou uvedeny žádné skutečné hodnoty hesel, API klíčů ani jiných tajných údajů — pouze skutečnost, že existují a kde. Nikdo z týmu provádějícího audit tyto hodnoty nepoužil ani nikam neodeslal.