Pengambilan URL yang Aman: Worksheet Desain Tahan SSRF
Pengambilan URL aman memerlukan mesin kebijakan, bukan regex. RFC 3986 membedakan scheme, host, port, userinfo, dan path; normalisasi yang tidak aman membuka bypass.
Worksheet desain
| Pertanyaan | Jawaban aman | Contoh |
|---|---|---|
| Siapa memilih host? | allowlist terkonfigurasi | provider feed kalender |
| Scheme apa? | HTTPS saja kecuali diperlukan | tolak file: |
| Redirect? | validasi ulang tiap hop | URL publik menuju IP privat |
| DNS? | resolve lalu periksa alamat hasil | rebinding ditolak |
Preview URL dan importer dokumen memerlukan kebijakan berbeda: preview dapat melarang semua alamat privat; importer dapat memakai hostname vendor tetap. Panduan pencegahan SSRF OWASP mendukung allowlist dan segmentasi jaringan.
Aturan keputusan: tolak tujuan yang tidak diotorisasi secara positif setelah parsing, resolusi, dan penanganan redirect.
Bangun dengan aman
Gunakan HTTP client hardened dengan redirect implisit dimatikan, ukuran respons dibatasi, egress filtering, dan identitas jaringan terpisah. Worksheet ini tidak membuat konten internet sewenang-wenang menjadi tepercaya. Audit kode dapat meninjau helper fetch.
Jadikan kebijakan tujuan dapat diamati
Gunakan URL parser yang benar, lalu nilai scheme, hostname, port, dan semua alamat hasil resolusi sebelum membuka koneksi. Matikan redirect implisit; bila redirect diizinkan, parse dan otorisasi target berikutnya sebagai request baru. Tetapkan batas connect, baca, total waktu, dan byte respons. Pisahkan identitas jaringan dari credential aplikasi utama dan blokir proxy environment bila tidak diperlukan.
Untuk partner tetap, allowlist hostname terkonfigurasi lebih kuat daripada menerima URL lengkap. Untuk preview terbuka, pemeriksaan alamat publik dan kebijakan egress sama-sama perlu. Uji ambiguitas userinfo, scheme tidak didukung, loopback literal, IPv6 privat, jawaban DNS berubah, redirect, port tidak lazim, dan respons oversized. Owner: pemilik layanan fitur. Lulus: kebijakan menghentikan tujuan tidak sah sebelum pemrosesan respons berguna. Gagal: alamat terlindungi atau layanan bercredential tercapai. Pengecualian mencatat tujuan, target, pengaman, approver, tanggal remediasi, dan kedaluwarsa.
Contoh kontrak fetch
Kebijakan terdokumentasi dapat menyatakan HTTPS saja, host partner terkonfigurasi, port diizinkan, redirect dimatikan, ukuran respons maksimum, dan timeout terbatas. Ini contoh, bukan setting universal; owner memilih batas dari kebutuhan fitur dan anggaran resource. Catat keputusan kebijakan serta alamat hasil resolusi, bukan isi respons penuh. Perlakukan callback URL pengguna sebagai capability terpisah.
Jejak keputusan fetch
Output yang diharapkan: URL ternormalisasi, versi kebijakan, aturan host diizinkan, alamat hasil resolusi, port terpilih, jumlah redirect, batas byte, hasil timeout. Bukti ini menghubungkan kebijakan tujuan dengan hasil koneksi yang tercatat.
Kegagalan teruji: URL preview memakai userinfo agar mirip host diizinkan tetapi tersambung ke tempat lain. Parsing harus memperlihatkan authority sebenarnya dan kebijakan harus menolak.
Kasus tepi: Partner dapat sah mengganti alamat. Nilai ulang setiap koneksi dengan aturan alamat publik; jangan menempelkan persetujuan lama pada string hostname.
Uji penutupan: Paksa redirect ke target IPv6 privat pada pengujian terkontrol. Penutupan lulus bila tidak ada socket terbuka dan jejak berisi alamat yang ditolak.
Pemisahan resolver dan konektor
Keputusan kebijakan harus bertahan melewati jarak antara lookup DNS dan pembuatan socket. Lakukan resolusi dengan perilaku resolver terkontrol, simpan alamat yang dikembalikan, dan sambungkan hanya ke alamat yang lolos kebijakan saat ini. Jawaban resolver berikutnya harus memulai evaluasi baru. Jika library client melakukan connection pool, verifikasi library tidak memakai ulang koneksi untuk host yang diotorisasi berbeda. Validasi sertifikat HTTPS tetap perlu; allowlist tujuan tidak mengautentikasi server.
Buat fixture uji yang memberi alamat publik saat validasi dan alamat terlarang saat simulasi koneksi. Sertakan redirect HTTP dengan nilai Location relatif, hostname internasional yang normalisasinya tidak terduga, dan port eksplisit di luar kebijakan. Output yang diharapkan adalah reason code terpisah untuk kegagalan parse, host, alamat, redirect, port, limit, atau timeout. Klasifikasi ini membantu owner memperbaiki kebijakan dengan aman tanpa mencatat konten remote sensitif.
Telemetri koneksi harus mencantumkan alamat tujuan yang benar-benar didial, bukan hanya hostname yang dikirim. Uji respons yang melewati batas byte setelah header valid. Hasil diharapkan adalah abort terbatas tanpa entri cache, pemanggilan parser, atau retry ke alamat lain.
Penanganan respons adalah bagian dari keamanan tujuan. Jangan meneruskan byte hasil fetch langsung ke parser gambar, arsip, markup, atau dokumen tanpa kontrol tipe dan ukuran. Tujuan jaringan aman masih dapat mengembalikan konten yang menghabiskan memori atau mengeksploitasi parser hilir. Catat content type sebagai observasi, bukan sinyal tepercaya. Uji respons chunked atau panjang tidak diketahui dan pastikan perhitungan byte berhenti membaca pada batas kebijakan. Ini memisahkan pencegahan SSRF dari pertahanan pemrosesan konten sambil mempertahankan keduanya.
Untuk URL yang memakai nama DNS dengan banyak jawaban, evaluasi semua alamat sebelum memilih koneksi. Jangan menerima karena satu jawaban publik bila jawaban lain dilarang. Fixture harus membuktikan daftar campuran ditolak dan tidak ada fallback otomatis yang mem-bypass keputusan awal.