En säkerhetskopia i webbroten läcker källkoden
Innan man redigerar en stor fil är det naturliga att först kopiera den. cp index.php index.php.vor-aenderung, och sedan börjar man arbeta. Om filen ligger i den katalog som webbservern publicerar har hela källkoden just blivit nedladdningsbar som ren text — databasuppgifter, hemligheter, allt som filen råkar innehålla.
Apache kör index.php genom PHP eftersom den slutar på .php. index.php.vor-aenderung slutar inte på .php. Den slutar på .vor-aenderung, som Apache aldrig har hört talas om, så Apache gör det förvalda och skickar byten som de är.
Regeln de flesta skriver, och varför den inte räcker
Det vanliga skyddet är en spärrlista med filändelser: .bak, .orig, .save, .sql, .old. Den fångar den fil man kom att tänka på. När listan testades här gav den rätt svar för probe.bak och fel svar för vart och ett av dessa:
index.php.vor-xyz— så gick det faktiskt tillindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
Alla levererades med 200. Det namnmönster som ingen tänkte på är det som faktiskt används, eftersom säkerhetskopior får namn efter vad som råkade pågå just då.
Vänd på frågan
Den regel som fungerar frågar inte vilka filändelser som är förbjudna. Den ställer en strukturell fråga: innehåller filnamnet en källkodsändelse som inte står sist?
Om det gör det är det en kopia av något som var tänkt att köras, oavsett vad ändelsen efter den säger. index.php.anything matchar. style.css.anything matchar. Mönstret täcker de namn som ingen har hittat på än, och det är hela poängen.
Kontrollerat mot den skarpa servern i dag returnerar alla fem namnen ovan nu 403, även de som inte finns — regeln nekar formen, inte filen.
Undantaget, och vad det lär oss
Ett legitimt filnamn här har precis den formen: förkomprimerade resurser skrivs som style.css.1787777226.gz, med en ändelse i mitten med avsikt. Därför har regeln ett enda snävt undantag för ett numeriskt segment följt av .gz, och den filen returnerar 200 som den ska.
Det är i sådana undantag som de här reglerna brukar gå fel, så det är värt att säga vad som gör just det här säkert: det är så snävt att inget index.php.something.gz kan konstrueras för att hämta tillbaka källkoden, eftersom mittsegmentet bara får bestå av siffror. Ett bredare undantag — ”allt som slutar på .gz” — hade gjort hela regeln verkningslös.
Och det enklaste rådet är fortfarande det som gör allt detta onödigt: förvara säkerhetskopior utanför den publicerade katalogen. Regeln är ett skyddsnät för den dag det glöms bort, inte en ursäkt för att sluta bry sig om var kopian hamnar.