Een reservekopie in de webmap is een bronlek
Voordat je een groot bestand bewerkt, is de natuurlijke zet er eerst een kopie van te maken. cp index.php index.php.vor-aenderung, en dan aan de slag. Staat dat bestand in de map die de webserver publiceert, dan is de hele broncode zojuist als platte tekst te downloaden geworden — databasegegevens, geheimen, alles wat er toevallig in staat.
Apache draait index.php door PHP omdat het op .php eindigt. index.php.vor-aenderung eindigt niet op .php. Het eindigt op .vor-aenderung, waar Apache nog nooit van gehoord heeft, dus doet hij het standaardding en stuurt de bytes.
De regel die de meeste mensen schrijven, en waarom die niet genoeg is
De gebruikelijke bescherming is een verbodslijst van extensies: .bak, .orig, .save, .sql, .old. Hij vangt het bestand dat in gedachten kwam. Hier getest gaf die lijst het juiste antwoord voor probe.bak en het verkeerde antwoord voor elk van deze:
index.php.vor-xyz— zo is het werkelijk gebeurdindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
Allemaal met 200 uitgeleverd. Het naamgevingspatroon waar niemand aan gedacht heeft, is het patroon dat gebruikt wordt, want reservekopieën worden genoemd naar wat er op dat moment aan de hand was.
Draai de snede om
De regel die wel werkt, vraagt niet welke extensies verboden zijn. Hij stelt een vraag over de vorm: bevat deze bestandsnaam een broncode-extensie die niet aan het eind staat?
Als dat zo is, is het een kopie van iets dat uitgevoerd had moeten worden, wat het achtervoegsel erna ook zegt. index.php.anything past. style.css.anything past. Het patroon dekt de namen die nog niemand bedacht heeft, en dat is de hele bedoeling.
Vandaag tegen de draaiende server gehouden geven alle vijf bovenstaande namen nu 403, ook die welke niet bestaan — de regel weigert de vorm, niet het bestand.
De uitzondering, en wat die leert
Eén rechtmatige bestandsnaam hier heeft precies die vorm: vooraf gecomprimeerde bestanden worden geschreven als style.css.1787777226.gz, een extensie in het midden met opzet. De regel draagt daarom één smalle uitzondering voor een stuk met alleen cijfers gevolgd door .gz, en dat bestand geeft 200 zoals het hoort.
Bij zo'n uitzondering gaan zulke regels meestal mis, dus het is de moeite waard te zeggen wat deze veilig maakt: hij is smal genoeg dat er geen index.php.something.gz te construeren valt om de bron terug te halen, want het middelste stuk mag alleen uit cijfers bestaan. Een bredere uitzondering — "alles wat op .gz eindigt" — zou de hele regel weer weggegeven hebben.
En het eenvoudigste advies blijft het advies dat dit alles overbodig maakt: bewaar reservekopieën buiten de gepubliceerde map. De regel is een vangnet voor de dag dat het vergeten wordt, geen vrijbrief om niet meer op te letten waar de kopie belandt.