flawopen.com/XSS/Unggahan SVG
Apakah unggahan SVG berisiko XSS?
SVG yang diunggah adalah dokumen, bukan sekadar piksel: format ini dapat berisi elemen aktif seperti skrip dan event handler. Eksekusinya bergantung pada konteks browser. SVG melalui <img> berada dalam konteks gambar terbatas; SVG inline, navigasi langsung, atau penyematan sebagai dokumen dapat bersifat aktif.
Perbedaan SVG dari format gambar lain
Tidak seperti PNG atau JPEG, SVG adalah XML yang dapat membawa konten aktif. Browser menonaktifkan skrip dalam konteks gambar terbatas seperti <img>, tetapi tidak saat SVG dibuka langsung, disematkan sebagai dokumen melalui <object>, <iframe>, atau <embed>, maupun dimasukkan secara inline. Gambar profil unggahan dapat menjadi stored XSS jika aplikasi menyajikannya sebagai dokumen aktif pada origin aplikasi. Perilaku bergantung pada konteks; ekstensi dan MIME bukan sanitasi.
Mengamankan unggahan
- ✓Gunakan sanitizer SVG terawat dengan allowlist eksplisit sebelum menyimpan atau menampilkan. Hapus elemen yang dapat dieksekusi, event handler, referensi eksternal, dan
foreignObjectjika tidak diperlukan; jangan sanitasi XML dengan regex. - ✓Jika pengguna hanya membutuhkan gambar, rasterisasi SVG dalam proses terisolasi dengan batas sumber daya lalu sajikan hasil raster. Simpan file asli di luar web root bila tidak diperlukan.
- ✓Sajikan unggahan dari domain registrable terpisah yang tidak menerima cookie aplikasi. Subdomain saudara masih dapat menerima cookie domain induk.
- ✓Jika SVG tak tepercaya harus dipertahankan sebagai dokumen, paksa unduhan dengan Content-Disposition: attachment dan
X-Content-Type-Options: nosniff, atau tampilkan hanya dalam konteks gambar terbatas seperti <img>. Hindari inline, <object>, <iframe>, dan penyajian dokumen pada origin yang sama.
Pertanyaan umum
['Apakah validasi ekstensi atau MIME cukup?', 'Tidak. Ekstensi dan MIME yang dinyatakan hanyalah metadata, bukan pemeriksaan konten aktif. Verifikasi format sebenarnya, lalu gunakan allowlist sanitizer khusus SVG atau konversi ke raster bila fitur SVG tidak dibutuhkan.']
Referensi
- OWASP XML Security Cheat Sheet
- flawopen.com — Cross-Site Scripting
- OWASP — File Upload Cheat Sheet
- OWASP ASVS — sanitizing or sandboxing SVG scriptable content