Kontaktovat podporu

Odpovíme e-mailem, obvykle do dvou dnů.

Google reCAPTCHA kontroluje toto odeslání kvůli ochraně před zneužitím; data se přitom předávají společnosti Google. Skript se načte až při otevření tohoto formuláře.

← Všechny články

Záloha v kořeni webu je únik zdrojového kódu

Před úpravou velkého souboru je přirozené si ho nejdřív zkopírovat. cp index.php index.php.vor-aenderung, a pak pracovat. Pokud ten soubor leží v adresáři, který webový server zveřejňuje, stal se právě celý zdrojový kód ke stažení jako prostý text – přístupové údaje k databázi, tajné klíče, všechno, co soubor zrovna obsahuje.

Apache pouští index.php přes PHP, protože končí na .php. index.php.vor-aenderung nekončí na .php. Končí na .vor-aenderung, o které Apache nikdy neslyšel, a tak udělá výchozí věc a pošle bajty.

Pravidlo, které píše většina lidí, a proč nestačí

Obvyklou ochranou je zakázaný seznam přípon: .bak, .orig, .save, .sql, .old. Zachytí soubor, který člověka napadl. Tady vyzkoušený seznam odpověděl správně pro probe.bak a špatně pro každý z těchto:

  • index.php.vor-xyz – tak se to skutečně stalo
  • index.php.2026-08-19
  • index.php.kopie
  • style.css.alt
  • index.php.1
název souboruodpověďprobe.bak403index.php.vor-xyz200index.php.2026-08-19200index.php.kopie200style.css.alt200naivní seznam zachytí jeden z pěti

Všechny doručeny s kódem 200. Použije se právě ten tvar názvu, na který nikdo nepomyslel, protože zálohy dostávají jména podle toho, co se zrovna dělo.

Obrátit řez

Pravidlo, které funguje, se neptá, které přípony jsou zakázané. Klade strukturní otázku: obsahuje tento název souboru příponu zdrojového kódu, která není na konci?

Pokud ano, jde o kopii něčeho, co se mělo spouštět, ať za tím stojí jakákoli koncovka. index.php.anything vyhovuje. style.css.anything vyhovuje. Vzor pokrývá i názvy, které si zatím nikdo nevymyslel, a právě o to jde.

Dnes ověřeno na živém serveru: všech pět názvů výše teď vrací 403, včetně těch, které neexistují – pravidlo odmítá tvar, ne soubor.

Výjimka a co z ní plyne

Jeden legitimní název souboru tu má přesně tento tvar: předem komprimované soubory se zapisují jako style.css.1787777226.gz, tedy záměrně s příponou uprostřed. Pravidlo proto obsahuje jedinou úzkou výjimku pro číselný segment následovaný .gz, a tento soubor vrací 200, jak má.

Taková výjimka je místo, kde se tato pravidla obvykle pokazí, a proto stojí za to říct, proč je tahle bezpečná: je tak úzká, že žádné index.php.something.gz nejde sestavit tak, aby vrátilo zdrojový kód, protože prostřední segment smí obsahovat jen číslice. Širší výjimka – „cokoli, co končí na .gz“ – by celé pravidlo zase rozdala.

A nejjednodušší rada zůstává ta, díky které je tohle všechno zbytečné: uchovávejte zálohy mimo zveřejněný adresář. Pravidlo je záchranná síť pro den, kdy se na to zapomene, ne povolení přestat se starat o to, kam kopie dopadne.

Reklama