Záloha v koreňovom adresári webu je únikom zdrojového kódu
V tomto článku
Pred úpravou veľkého súboru je prirodzené najprv ho skopírovať. cp index.php index.php.vor-aenderung, potom pracovať. Ak je tento súbor v adresári, ktorý webový server zverejňuje, celý zdrojový kód sa práve stal stiahnuteľným ako obyčajný text — prihlasovacie údaje databázy, tajomstvá, všetko, čo súbor obsahuje.
Apache spúšťa index.php cez PHP, pretože sa končí na .php. index.php.vor-aenderung sa nekončí na .php. Končí sa na .vor-aenderung, o čom Apache nikdy nepočul, takže urobí predvolenú vec a odošle bajty.
Pravidlo, ktoré píše väčšina ľudí, a prečo nestačí
Bežnou ochranou je zoznam zakázaných prípon: .bak, .orig, .save, .sql, .old. Zachytí súbor, ktorý niekomu napadol. Pri tunajšom teste tento zoznam dal správnu odpoveď pre probe.bak a nesprávnu odpoveď pre každý z týchto súborov:
index.php.vor-xyz— ako sa to naozaj staloindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
Všetky sa poskytovali s 200. Použije sa práve vzor pomenovania, na ktorý nikto nemyslel, pretože zálohy dostávajú názvy podľa toho, čo sa práve dialo.
Obráťte hranicu výberu
Funkčné pravidlo sa nepýta, ktoré prípony sú zakázané. Pýta sa na štruktúru: obsahuje tento názov súboru príponu zdrojového kódu, ktorá nie je na konci?
Ak áno, je to kópia niečoho, čo sa malo spustiť, bez ohľadu na príponu za tým. index.php.anything sa zhoduje. style.css.anything sa zhoduje. Vzor pokrýva názvy, ktoré ešte nikto nevymyslel, a práve o to ide.
Pri dnešnom overení na živom serveri všetkých päť uvedených názvov teraz vracia 403 vrátane tých, ktoré neexistujú — pravidlo odmieta tvar, nie súbor.
Výnimka a jej poučenie
Jeden legitímny názov súboru tu má presne takýto tvar: vopred komprimované zdroje sa zapisujú ako style.css.1787777226.gz, so zámernou príponou uprostred. Pravidlo preto obsahuje jedinú úzku výnimku pre číselný úsek nasledovaný .gz, pričom tento súbor vracia 200, ako má.
Práve pri takejto výnimke sa tieto pravidlá zvyčajne pokazia, preto sa oplatí povedať, čo robí túto bezpečnou: je dosť úzka na to, aby sa nedalo vytvoriť žiadne index.php.something.gz na spätné načítanie zdroja, pretože stredný úsek musí obsahovať iba číslice. Širšia výnimka — „čokoľvek končiace sa na .gz“ — by znefunkčnila celé pravidlo.
A najjednoduchšou radou zostáva tá, vďaka ktorej je toto všetko zbytočné: uchovávajte zálohy mimo zverejňovaného adresára. Pravidlo je záchrannou sieťou na deň, keď sa na to zabudne, nie povolením prestať sa starať o to, kde kópia skončí.