FlawOpen

flawopen.com/Keamanan Android WebView/addJavascriptInterface

Android addJavascriptInterface: risiko dan penggunaan aman

Halaman referensi
Jawaban singkat

Anggap WebView dengan addJavascriptInterface sebagai batas berhak istimewa. Android menyuntikkan objek ke setiap frame dan aplikasi tidak dapat mengetahui frame mana yang memanggil metode. Jika JavaScript yang dikendalikan penyerang mencapai frame mana pun, JavaScript itu dapat memanggil metode yang diekspos dengan izin aplikasi. Gunakan WebView ber-bridge hanya untuk konten yang dikendalikan aplikasi, lalu muat halaman tak tepercaya di WebView terpisah tanpa bridge.

Mengapa bridge mengubah dampak XSS

Bridge memberi JavaScript titik masuk yang dapat memanggil aplikasi host. Android mengekspos objek ke semua frame, termasuk iframe, dan addJavascriptInterface tidak memeriksa origin frame pemanggil. Skrip yang disuntikkan karena itu dapat mencapai metode bridge beranotasi; kemampuannya dibatasi oleh metode tersebut dan pemeriksaan otorisasi aplikasi. Untuk aplikasi dengan target API 16 atau lebih lama, Android mendokumentasikan perilaku lama yang lebih berbahaya: semua metode publik mungkin terekspos. Mulai API 17, @JavascriptInterface diwajibkan, tetapi anotasi itu tidak membuat konten tak tepercaya menjadi aman.

Jauhkan bridge dari halaman tak tepercaya

BERISIKO — bridge dan navigasi tak tepercaya memakai WebView yang sama
webView.addJavascriptInterface(
  NativeBridge(), "Android"
)
webView.loadUrl(untrustedUrl)
LEBIH AMAN — pisahkan konten tepercaya dan tak tepercaya
// WebView ini khusus untuk UI paket yang dikendalikan aplikasi.
trustedWebView.settings.javaScriptEnabled = true
trustedWebView.addJavascriptInterface(
  NativeBridge(), "Android"
)
trustedWebView.loadUrl("file:///android_asset/index.html")

// WebView lain menangani halaman jarak jauh atau yang dikendalikan pengguna.
untrustedWebView.removeJavascriptInterface("Android")
untrustedWebView.settings.javaScriptEnabled = false
// Validasi HTTPS dan allowlist host yang eksplisit.
untrustedWebView.loadUrl(validatedHttpsUrl)

Batas terkuat berasal dari arsitektur: jangan arahkan WebView ber-bridge ke halaman jarak jauh, buatan pengguna, atau yang dipengaruhi penyerang. Jika konten tak tepercaya harus dimuat, hapus interface sebelum pemuatan dan gunakan WebView terpisah dengan JavaScript dinonaktifkan kecuali diperlukan. Android menyatakan objek yang disuntikkan tersedia bagi semua frame dan penghapusan baru berlaku setelah pemuatan halaman berikutnya. HTTPS melindungi transport; ini tidak menjadikan host atau kontennya tepercaya. Validasi skema dan host URL, lalu buka tautan di luar allowlist melalui browser sistem. Batasi metode bridge, validasi setiap argumen, dan terapkan otorisasi di kode native alih-alih memercayai halaman pemanggil.

FAQ keamanan bridge Android WebView

Apakah API 17 atau yang lebih baru otomatis membuat addJavascriptInterface aman?

Tidak. API 17+ membatasi eksposur pada metode publik beranotasi @JavascriptInterface; fitur ini tidak memeriksa origin frame pemanggil atau membuat konten yang dikendalikan penyerang menjadi tepercaya. Batasi bridge pada WebView yang hanya memuat konten kendalian aplikasi.

Referensi

Lihat juga Cross-Site Scripting (XSS, CWE-79): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com Perlindungan XSS Angular: default aman dan API bypass XSS akibat MIME sniffing: Content-Type dan nosniff CSP dan output escaping: apakah keduanya diperlukan? Apakah dangerouslySetInnerHTML di React aman? Apakah DOMPurify cukup untuk mengamankan innerHTML? Apakah rendering Markdown aman dari XSS?