A webgyökérben hagyott biztonsági mentés kiszivárogtatja a forráskódot
Egy nagy fájl szerkesztése előtt kézenfekvő először lemásolni. cp index.php index.php.vor-aenderung, és csak utána jöhet a munka. Ha ez a fájl abban a könyvtárban van, amelyet a webszerver közzétesz, a teljes forráskód máris letölthetővé vált egyszerű szövegként — adatbázis-hozzáférési adatok, titkos kulcsok, bármi, ami éppen a fájlban van.
Az Apache az index.php fájlt a PHP-n keresztül futtatja, mert a vége .php. Az index.php.vor-aenderung vége viszont nem .php, hanem .vor-aenderung, amelyről az Apache sosem hallott, így az alapértelmezés szerint jár el: elküldi a bájtokat.
A szabály, amelyet a legtöbben írnak, és miért nem elég
A szokásos védelem a kiterjesztések tiltólistája: .bak, .orig, .save, .sql, .old. Azt a fájlt fogja meg, amelyik éppen eszünkbe jutott. Itt kipróbálva ez a lista a probe.bak esetén helyesen döntött, az alábbiak mindegyikénél viszont rosszul:
index.php.vor-xyz— így történt a valóságbanindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
Mindet 200-as kóddal kiszolgálta. Mindig az az elnevezési minta kerül használatba, amelyre senki sem gondolt, mert a mentéseket arról nevezik el, ami éppen történt.
Fordítsuk meg a szempontot
A működő szabály nem azt kérdezi, mely kiterjesztések tiltottak. Szerkezeti kérdést tesz fel: tartalmaz-e a fájlnév olyan forráskód-kiterjesztést, amely nem a végén áll?
Ha igen, akkor valaminek a másolata, amit futtatásra szántak, bármit mondjon is az utána következő toldalék. index.php.anything illeszkedik. style.css.anything illeszkedik. A minta lefedi azokat a neveket is, amelyeket még senki sem talált ki, és éppen ez a lényeg.
A mai napon az éles szerveren ellenőrizve a fenti öt név mindegyike 403-at ad vissza, azok is, amelyek nem is léteznek — a szabály az alakot tiltja, nem a fájlt.
A kivétel, és amit tanít
Egy jogos fájlnév itt pontosan ilyen alakú: az előre tömörített erőforrások így íródnak ki: style.css.1787777226.gz, vagyis szándékosan kiterjesztéssel a közepén. A szabály ezért egyetlen szűk kivételt tartalmaz: egy csak számjegyekből álló szegmenst, amelyet ez követ: .gz, és ez a fájl a várt módon 200-at ad vissza.
Az ilyen kivételeknél szoktak elcsúszni ezek a szabályok, ezért érdemes kimondani, mi teszi ezt biztonságossá: elég szűk ahhoz, hogy semmilyen index.php.something.gz ne legyen összeállítható, amellyel a forrás visszaszerezhető, mert a középső szegmens csak számjegyekből állhat. Egy tágabb kivétel — „bármi, ami .gz-re végződik” — az egész szabályt hatástalanná tette volna.
A legegyszerűbb tanács pedig továbbra is az, amely mindezt fölöslegessé teszi: a biztonsági mentéseket a közzétett könyvtáron kívül kell tartani. A szabály védőháló arra a napra, amikor ez feledésbe merül, nem pedig felmentés az alól, hogy törődjünk vele, hová kerül a másolat.