.env dan .git ikut ter-deploy ke hosting: cara cek dan menutupnya
Ada dua berkas yang tidak pernah boleh bisa diakses dari internet: .env (berisi kunci dan koneksi database) dan folder .git (berisi seluruh riwayat kode, termasuk kunci yang sudah Anda hapus). Keduanya sering ikut terunggah bukan karena serangan, tapi karena cara deploy.
Bagaimana berkas itu bisa ikut terunggah
- Deploy drag-and-drop atau unggah manual. Folder proyek di-zip lalu diunggah utuh ke hosting. Berkas tersembunyi (diawali titik) ikut masuk, dan server menyajikannya seperti berkas biasa.
- rsync tanpa filter.
rsync -av ./ user@server:/var/www/menyalin semua, termasuk.envdan.git. Filter--excludesering lupa ditulis. - Web server tanpa aturan dotfile. nginx/Caddy menyajikan berkas apa pun yang ada di root. Tanpa blokir eksplisit,
/.envberubah menjadi halaman web. - Build artifact yang membawa sisa file. Sebagian pipeline menyalin folder kerja apa adanya ke direktori publik, bukan hanya folder hasil build.
Begitu bisa diakses, isinya bisa dibaca tanpa alat khusus. Dari .env orang mendapat koneksi database, kunci API, dan kredensial SMTP. Dari .git orang bisa merekonstruksi kode sumber Anda, termasuk kunci yang pernah di-commit lalu dihapus di commit berikutnya.
Cara memeriksa — 30 detik, tanpa alat
curl -sI https://domain-anda/.env— harus404(atau403). Kalau200, berhenti di sini dan tutup dulu.curl -sI https://domain-anda/.git/HEAD— sama, harus 404/403. Jawaban berisiref: refs/heads/mainberarti repo Anda publik.curl -sI https://domain-anda/.git/config— kalau terbaca, biasanya memuat URL repo dan nama pengguna.- Coba juga
/.env.local,/.env.production, dan/config.json: nama berkas berbeda, masalahnya sama.
Menutupnya: tiga lapis, dari paling benar
- Keluarkan dari direktori publik.
.envtidak perlu ada di server web sama sekali — simpan di panel environment penyedia hosting atau di file di luar webroot (mis./etc/app/app.env) yang dibaca oleh proses aplikasi, bukan oleh HTTP server. - Blokir di web server. Caddy:
@hidden path /.* /.*/*lalurespond @hidden 404. nginx:location ~ /\\. { deny all; }. Ini lapisan kedua, bukan pengganti langkah pertama. - Deploy dengan filter. Untuk rsync, tambahkan
--exclude='.env*' --exclude='.git/'. Untuk pipeline, salin hanya folder build.
Kalau berkas itu pernah bisa diakses, anggap isinya sudah bocor: rotasi semua kunci di dalamnya, dan kalau .git terbuka, anggap kode sumber Anda publik.
Apa yang diperiksa AISG untuk kasus ini
Free URL scan di /#free-scan memeriksa tiga jalur — /.env, /.git/HEAD, /.git/config — dan melaporkannya sebagai temuan dengan bukti yang disamarkan: yang ditampilkan hanya cuplikan aman (status HTTP dan pola nama variabel), bukan isi rahasianya. Batasnya jujur: scan ini tidak menyapu seluruh nama berkas, jadi "tidak ditemukan" bukan berarti tidak ada .env.local di tempat lain. Empat perintah curl di atas tetap cara paling cepat memastikan sendiri.
Untuk pemeriksaan menyeluruh — riwayat git, rahasia di seluruh repo, aturan deploy — Anda perlu scan lokal dari worker, yang membaca kode di komputer Anda tanpa mengirimkannya ke mana pun.