Cadangan di web root adalah kebocoran kode sumber
Sebelum mengedit file besar, langkah yang wajar adalah menyalinnya terlebih dahulu. cp index.php index.php.vor-aenderung, lalu mulai bekerja. Jika file itu berada di direktori yang dipublikasikan server web, seluruh kode sumber baru saja menjadi dapat diunduh sebagai teks biasa — kredensial basis data, rahasia, semua yang kebetulan dimuat file itu.
Apache menjalankan index.php melalui PHP karena berakhiran .php. index.php.vor-aenderung tidak berakhiran .php. File itu berakhiran .vor-aenderung, yang tidak dikenal Apache, sehingga Apache melakukan tindakan bawaan dan mengirim byte-nya.
Aturan yang ditulis kebanyakan orang, dan mengapa itu tidak cukup
Pengaman yang biasa adalah daftar penolakan ekstensi: .bak, .orig, .save, .sql, .old. Daftar itu menangkap file yang terpikirkan. Saat diuji di sini, daftar itu memberikan jawaban yang benar untuk probe.bak dan jawaban yang salah untuk semua nama berikut:
index.php.vor-xyz— begitulah yang sebenarnya terjadiindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
Semuanya disajikan dengan 200. Pola penamaan yang tidak terpikirkan oleh siapa pun justru yang dipakai, karena cadangan diberi nama sesuai apa pun yang sedang terjadi saat itu.
Balik cara memilahnya
Aturan yang berhasil tidak menanyakan ekstensi mana yang dilarang. Aturan itu mengajukan pertanyaan struktural: apakah nama file ini mengandung ekstensi kode sumber yang tidak berada di akhir?
Jika ya, file itu adalah salinan dari sesuatu yang dimaksudkan untuk dijalankan, apa pun akhiran di belakangnya. index.php.anything cocok. style.css.anything cocok. Pola ini mencakup nama-nama yang belum diciptakan siapa pun, dan justru itulah intinya.
Setelah diperiksa pada server langsung hari ini, kelima nama di atas kini mengembalikan 403, termasuk yang tidak ada — aturan ini menolak bentuknya, bukan filenya.
Pengecualiannya, dan pelajaran darinya
Ada satu nama file sah di sini yang memiliki bentuk persis seperti itu: aset yang telah dikompresi sebelumnya ditulis sebagai style.css.1787777226.gz, dengan ekstensi di tengah yang memang disengaja. Karena itu aturan ini memuat satu pengecualian sempit untuk segmen angka yang diikuti .gz, dan file itu mengembalikan 200 sebagaimana mestinya.
Pengecualian seperti itulah yang biasanya membuat aturan semacam ini gagal, jadi perlu dijelaskan apa yang membuat pengecualian ini aman: pengecualian ini cukup sempit sehingga tidak ada index.php.something.gz yang dapat disusun untuk mengambil kembali kode sumbernya, karena segmen tengah harus berupa angka saja. Pengecualian yang lebih luas — “apa pun yang berakhiran .gz” — akan membatalkan seluruh aturan.
Dan saran paling sederhana tetaplah yang membuat semua ini tidak perlu: simpan cadangan di luar direktori yang dipublikasikan. Aturan ini adalah jaring pengaman untuk hari ketika hal itu terlupakan, bukan izin untuk berhenti peduli di mana salinan itu berada.