𝗦𝗲𝗰𝘂𝗿𝗶𝘁𝘆 𝗔𝘂𝗱𝗶𝘁 𝗥𝗲𝘀𝘂𝗹𝘁𝘀: 𝗪𝗵𝘆 𝗜 𝗳𝗲𝗹 𝗲𝗺𝗯𝗮𝗿𝗿𝗮𝘀𝘀𝗲𝗱
Baru-baru ini saya menjalankan audit keamanan pada semua proyek sampingan saya. Ini mencakup backend FastAPI, bot Telegram, PWA, dan aplikasi Streamlit saya.
Saya pikir kode saya aman karena saya sudah berhati-hati. Ternyata saya salah.
Saya membagikan bug produksi nyata ini untuk membantu Anda menghindarinya. Ini bukan sekadar daftar periksa teoretis. Ini adalah kesalahan yang benar-benar saya lakukan.
Jebakan Autentikasi Bersyarat Saya menulis kode yang memeriksa apakah API secret ada sebelum memverifikasinya. Jika variabel lingkungan (environment variable) hilang, pemeriksaan tersebut dilewati sepenuhnya. Ini berarti seluruh API saya terbuka untuk publik. Aturan: Jika secret hilang, berikan error 500 secara tegas. Jangan pernah melewatkan autentikasi.
Kebocoran Riwayat Git Saya pernah melakukan hardcode API key untuk pengujian cepat. Saya memindahkannya ke file .env kemudian dan mengira masalahnya sudah selesai. Namun Git mengingat segalanya. Siapa pun dapat menemukan kunci tersebut dalam riwayat commit saya. Aturan: Jika Anda melakukan commit sebuah kunci, anggaplah kunci tersebut telah dicuri. Segera lakukan rotasi. Gunakan git-filter-repo untuk membersihkan riwayat Anda.
Kebocoran Endpoint Debug Saya membiarkan endpoint
/debug/configdi produksi untuk membantu saya melakukan troubleshooting. Hal ini mengekspos URL database dan pengaturan lingkungan saya. Aturan: Hapus semua endpoint debug sebelum deployment. Gunakan log sebagai gantinya.Membocorkan Info Sistem melalui Error Saya menggunakan
str(e)dalam respons error saya. Ini mengirimkan error database dan jalur file (file paths) langsung ke pengguna. Penyerang menggunakan hal ini untuk memetakan infrastruktur Anda. Aturan: Catat error yang mendetail untuk diri Anda sendiri. Kirimkan pesan "Internal Server Error" yang umum kepada klien.Risiko XSS di Frontend Saya menggunakan
innerHTMLuntuk merender konten pengguna. Ini memungkinkan skrip berjalan di browser pengguna lain. Aturan: Selalu lakukan escape pada HTML. AnggapinnerHTMLsebagai cara untuk mengeksekusi kode arbitrer.Kurangnya Rate Limiting Saya memiliki endpoint yang memanggil model AI mahal tanpa batasan apa pun. Satu kali loop atau satu kunci yang dicuri dapat merugikan saya ratusan dolar. Aturan: Autentikasi menghentikan pengguna yang tidak sah. Rate limiting menghentikan pengguna yang sah agar tidak menyalahgunakan sistem Anda.
Kebijakan CORS yang Terlalu Longgar Saya menggunakan
allow_origins=["*"]di produksi. Ini memungkinkan situs apa pun untuk melakukan permintaan ke API Anda. Aturan: Hanya izinkan domain frontend spesifik Anda.Kebocoran File Sementara Jika kode saya crash saat memproses file, file sementara tersebut akan tetap ada di disk selamanya. Ini membuang-buang ruang penyimpanan dan membocorkan data sensitif. Aturan: Gunakan blok try-finally untuk memastikan file dihapus meskipun terjadi kesalahan.
Daftar periksa wajib baru saya:
Sebelum menulis kode: • Buat .gitignore • Buat .env.example
Untuk setiap endpoint: • Tambahkan autentikasi • Gunakan pesan kesalahan yang umum • Tambahkan rate limits pada tugas-tugas yang berat
Sebelum melakukan commit: • Pindai secrets dalam diff Anda
Sebelum melakukan deployment: • Jalankan audit keamanan pada dependensi Anda
Masalah keamanan tidak terjadi secara kebetulan. Masalah tersebut terjadi karena komentar "TODO" dan perbaikan "sementara" yang tetap ada di produksi selamanya.
Memperbaiki bug itu membosankan. Memperbaiki kebocoran data itu mahal.