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ě staloindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
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.