Přejít na obsah

Nastavení cookies

Zvolte, které druhy cookies povolíte. Svou volbu můžete kdykoli změnit přes Nastavení cookies v dolní části každé stránky. Prohlášení o ochraně osobních údajů

Nezbytné

Vždy zapnuté

Potřebné pro přihlášení, uchování košíku a zapamatování vašich voleb. Jsou vždy zapnuté.

Které cookies?
  • weboke_sessie, weboke_klant, weboke_remember: vaše relace a trvalé přihlášení
  • weboke_basket: váš košík
  • wkBtwIncl: zobrazení cen s DPH nebo bez DPH
  • wok_cookies: vaše volba cookies, 12 měsíců

Měří, která reklama vede k návštěvě nebo objednávce, abychom neplatili za reklamy, které nic nepřinášejí.

Které cookies?
  • Google Ads přes Google Tag Manager (_gcl_au, _gcl_aw), až 90 dní
  • OpenAI Ads, reklamy v ChatGPT
  • wok_aff: partner, který vás k nám doporučil (partnerský program), 60 dní

4,6

Země a jazyk

Každá země má vlastní web s cenami a DPH dané země.

Zobrazit

Zabezpečení webu: oprávnění, hlavičky a bezpečnostní pluginy

Modul 7: Zabezpečení · Doba čtení: 10 minut

Cíl lekce: Po této lekci dokážete zabezpečit WordPress web pomocí oprávnění, nastavení a bezpečnostních hlaviček a dokážete posoudit přínos bezpečnostních pluginů.

Klíčové pojmy: zabezpečení (hardening), oprávnění k souborům (644, 755), DISALLOW_FILE_EDIT, žádné PHP ve složce uploads, výpis obsahu složky, skrytí verze, X-Powered-By, bezpečnostní hlavičky, zálohové soubory a .git ve webovém adresáři, WAF na serveru, WAF v pluginu, malware scanner

Co znamená zabezpečení (hardening)

Zabezpečení (hardening) znamená: nastavit web tak, aby chyba nebo únik způsobily co nejmenší škodu. Nenahrazuje aktualizace a silná hesla (lekce 7.2 a 7.3), ale zmenšuje následky. Představte si dům: aktualizace jsou zámky, zabezpečení znamená zajistit, aby se zloděj, který se přesto dostal dovnitř, nedostal k trezoru.

Oprávnění k souborům

Každý soubor a každá složka na serveru má oprávnění: kdo smí číst, zapisovat a spouštět. Zapisují se jako tři číslice, pro vlastníka, skupinu a ostatní. Doporučení z dokumentace WordPressu:

CoOprávněníVýznam
Složky755Vlastník smí vše, ostatní mohou číst a otevírat
Soubory644Vlastník smí číst a zapisovat, ostatní pouze číst
wp-config.phppřísnější, například 600 nebo 640Číst smí pouze vlastník (a případně skupina webového serveru)

Která hodnota pro wp-config.php funguje, závisí na tom, jak Váš hosting provozuje PHP: u většiny sdíleného hostingu běží PHP pod Vaším vlastním uživatelem, a pak stačí 600. Vyzkoušejte to a zkontrolujte, zda web stále funguje.

Nikdy 777. To znamená: kdokoli na serveru smí zapisovat. Návod, který říká „nastavte složku na 777, pokud nahrávání nefunguje“, řeší problém špatně. U kvalitního hostingu to navíc není nikdy potřeba.

Nastavení v wp-config.php

Pár řádků, které hodně pomohou (nad „to je vše, přestaňte upravovat“):

// Žádné úpravy souborů z administrace (Vzhled > Editor šablon a Pluginy > Editor pluginů).
define( 'DISALLOW_FILE_EDIT', true );

// Chybová hlášení nikdy nezobrazovat návštěvníkům (lekce 5.4).
define( 'WP_DEBUG', false );

Pomocí DISALLOW_FILE_EDIT zmizí editor, kterým lze v administraci upravovat PHP soubory šablon a pluginů. Útočník, který ovládne účet administrátora, tak nemůže dvěma kliknutími vložit škodlivý kód do Vaší šablony. Pluginy stále můžete instalovat; chcete li zakázat i to (například u webu, který spravujete pro klienta), existuje DISALLOW_FILE_MODS, ale pak nebudou fungovat ani aktualizace z administrace.

Žádné PHP ve složce uploads, žádný výpis obsahu složky

Do wp-content/uploads patří obrázky a dokumenty, nikdy PHP soubory. Útočníci, kteří dokážou přes nějakou zranitelnost nahrát soubor, se právě snaží umístit tam PHP soubor a následně ho vyvolat. Zablokujte to pomocí .htaccess ve složce uploads (u LiteSpeed a Apache):

<Files *.php>
Require all denied
</Files>

Vypněte také zobrazování výpisu složek. Bez souboru index.php nebo index.html ve složce některé webové servery zobrazí seznam všech souborů („Index of /wp-content/uploads/2026/11“). To je výloha pro každého, kdo hledá zálohy nebo citlivé dokumenty. V souboru .htaccess ve Vašem webovém adresáři:

Options -Indexes

Mnoho poskytovatelů hostingu to má již standardně vypnuté. Úkol v této lekci to ověří.

Žádné zbytky ve webovém adresáři

Vše ve webovém adresáři lze vyvolat přes web, kromě toho, co server spustí jako PHP nebo zablokuje. Nebezpečné jsou:

  • kopie wp-config.php (wp-config.php.bak, wp-config.old, wp-config.php~ z textového editoru): obsahují heslo k databázi a jsou odeslány jako text (lekce 1.3);
  • zálohy jako backup.zip, site.tar.gz nebo database.sql ve webovém adresáři;
  • složka .git od vývojáře, pomocí které si může někdo stáhnout celý Váš kód (a někdy i hesla);
  • debug.log ve wp-content (lekce 5.4);
  • staré instalační nebo testovací soubory, například info.php s phpinfo().

Zálohy ukládejte mimo webový adresář nebo mimo server a zbytky uklízejte.

Skrytí verze: malý přínos

WordPress standardně vkládá do HTML:

<meta name="generator" content="WordPress 7.1.4" />

a totéž ve zdroji RSS. I PHP se někdy hlásí v hlavičce: X-Powered-By: PHP/8.3.14. Skrytí je rozumné, ale neočekávejte od něj příliš: útočné programy zranitelnost prostě zkusí bez ohledu na zobrazenou verzi a verzi lze často odvodit i z ?ver= za skripty. Skrytí je úklid, ne zabezpečení. Web, který skrývá svou verzi, ale neaktualizuje se, je stejně zranitelný.

Uděláte to takto, ve vlastním malém pluginu nebo v functions.php podřazené šablony (child theme):

remove_action( 'wp_head', 'wp_generator' );
add_filter( 'the_generator', '__return_empty_string' );

A PHP hlavičku pomocí expose_php = Off v nastavení PHP u Vašeho poskytovatele hostingu (u DirectAdmin v Select PHP version, Options), nebo pomocí Header unset X-Powered-By v .htaccess.

Bezpečnostní hlavičky

Pomocí několika hlaviček řeknete prohlížeči, jak má s Vaším webem zacházet. Nejdůležitější:

HlavičkaCo dělá
Strict-Transport-SecurityPouze přes https (lekce 3.1)
X-Content-Type-Options: nosniffProhlížeč nehádá, o jaký typ souboru jde; zabraňuje tomu, aby byl nahraný „obrázek“ spuštěn jako skript
X-Frame-Options: SAMEORIGIN nebo Content-Security-Policy: frame-ancestors 'self'Jiné weby nesmí Váš web zobrazit v rámci (frame); zabraňuje clickjackingu (neviditelné tlačítko Vašeho webu pod webem někoho jiného)
Referrer-Policy: strict-origin-when-cross-originPři kliknutí na odkaz na jiný web se předá pouze Vaše doména, ne celá adresa
Permissions-PolicyVypne funkce prohlížeče, které Váš web nepoužívá (kamera, mikrofon, poloha)
Content-Security-PolicyPřesně určuje, z jakých zdrojů smí pocházet skripty a styly. Účinné, ale u WordPressu a pluginů složité správně nastavit; začněte v režimu Report-Only

V souboru .htaccess (u LiteSpeed a Apache):

<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>

Poté otestujte, zda vše funguje: vložený obsah, platební tlačítka, chatovací widget. Externí nástroje jako securityheaders.com a internet.nl ukážou, co Váš web skutečně odesílá.

Bezpečnostní pluginy, upřímně zhodnoceno

Existuje mnoho bezpečnostních pluginů (například Wordfence, Solid Security, All-In-One Security, Sucuri). Často v sobě sdružují: firewall, malware scanner, ochranu přihlašování, dvoufázové ověření, upozornění a seznam opatření pro zabezpečení. Užitečné, ale s omezeními:

  • Firewall v pluginu (WAF) se spustí až ve chvíli, kdy běží PHP. Škodlivý požadavek musí nejdříve projít webovým serverem a PHP, než ho plugin vůbec zaznamená. Zranitelnost v PHP souboru, který je volán přímo, nebo útok, který silně zatíží samotné PHP, tak nemusí vždy zastavit. Firewall na serveru (například ModSecurity, Imunify360 nebo firewall Vašeho poskytovatele hostingu) je v řetězci dříve a zastaví více, aniž by výpočetní zátěž nesl Váš plugin. Zeptejte se svého poskytovatele hostingu, co běží na serveru.
  • Scanner nalézá až dodatečně. Malware scanner Vám sdělí, že něco není v pořádku. To je cenné, ale nic to nezabrání. A scanner běžící na stejném serveru jako napadený web může být útočníkem upraven i on sám.
  • Nenahrazují aktualizace. Plugin se známou zranitelností zůstává zranitelný, i když vedle něj běží bezpečnostní plugin. Některé bezpečnostní služby nabízejí „virtuální záplaty“, které zastaví známé útoky, dokud neprovedete aktualizaci; vhodné jako přemostění, ne jako náhrada.
  • Jsou samy pluginem. Více kódu, více věcí k aktualizaci, občas i vlastní zranitelnost. A dva bezpečnostní pluginy současně se často vzájemně ruší.
  • Stojí výpočetní výkon, zejména scannery běžící na Vašem vlastním serveru.

Rozumný postup: nejprve zjistěte, co už dělá Váš poskytovatel hostingu (firewall, kontrola malwaru, blokování pokusů o přihlášení). Doplňte to, co chybí, obvykle dvoufázové ověření a omezení počtu pokusů o přihlášení. Rozsáhlý bezpečnostní plugin je užitečný zejména u hostingu, který sám dělá málo.

Shrnutí

  • Zabezpečení (hardening) omezuje škodu způsobenou chybou nebo zranitelností; nenahrazuje aktualizace a hesla.
  • Složky 755, soubory 644, wp-config.php přísněji; nikdy 777.
  • Zapněte DISALLOW_FILE_EDIT, zablokujte PHP ve složce uploads, vypněte výpis obsahu složek a odstraňte zálohy, .git a debug.log z webového adresáře.
  • Skrytí verze je úklid, ne zabezpečení; bezpečnostní hlavičky pomáhají prohlížeči chránit Vaše návštěvníky.
  • Firewall na serveru zastaví více než plugin; bezpečnostní pluginy jsou doplněk, ne náhrada.

Kvíz

1. Návod říká: „nastavte wp-content na 777, pokud nahrávání nefunguje.“ Co si o tom myslíte?



2. Co dělá DISALLOW_FILE_EDIT?



3. Proč je firewall na serveru v řetězci dříve než firewall v pluginu?



4. Odstranili jste tag generator. Je Váš web nyní chráněný proti zranitelnostem ve starých verzích?



5. Která hlavička zabraňuje tomu, aby jiný web načetl Váš web v neviditelném rámu (frame)?



Úkol

Úkol A7.4: Co Váš web ukazuje úplně všem? Zadejte adresu svého webu. Program načte domovskou stránku a RSS kanál (/feed/) a zkontroluje: neobsahuje li tag generator v HTML a ve feedu verzi WordPressu, nezobrazuje li hlavička X-Powered-By verzi PHP, a zda Váš web odesílá X-Content-Type-Options: nosniff, ochranu proti rámům (X-Frame-Options nebo frame-ancestors) a Referrer-Policy. Chybějící HSTS (lekce 3.1) a Permissions-Policy je v pořádku (oranžová).

Úkol A7.4: Co Váš web ukazuje úplně všem?


Co vyplníte a co zjistíme, neukládáme. Váš prohlížeč si pamatuje Vaše odpovědi a to, zda jste úkol splnili. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol měli (téměř) správně; i to tam můžete odstranit.

Úkol A7.4b: Žádné zbytky ve webovém adresáři. Dokažte, že je to Váš vlastní web (TXT záznam nebo soubor s kódem úkolu). Program poté ověří krátký pevný seznam: složku /wp-content/uploads/ (žádný výpis obsahu), /.git/HEAD, /wp-content/debug.log a několik běžných názvů kopií wp-config.php. V pořádku je, pokud žádný z nich nevrátí obsah (404 nebo 403). Program nic jiného nezkouší a nic nemění.

Úkol A7.4b: Žádné zbytky ve webovém adresáři

Tato kontrola zjišťuje cesty, proto ji nechte provést pouze na svém vlastním webu. Nejprve klikněte na "Zobrazit můj kód" a vložte tento kód jako TXT záznam na _weboke-cursus.<vaše doména>, nebo jako soubor na svém webu (viz vysvětlení u kódu).


Co vyplníte a co zjistíme, neukládáme. Váš prohlížeč si pamatuje Vaše odpovědi a to, zda jste úkol splnili. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol měli (téměř) správně; i to tam můžete odstranit.

Další čtení

Tyto články popisují jednotlivé kroky v panelech WebOké; v jiných panelech fungují obdobně.

Chvíli strpení…

Nastavení vašich domén

U každé domény nastavte jmenné servery, propojení s hostingem a to, kdo bude držitelem.

Načítání vašich domén…