為何出現此錯誤訊息?Using setJavaScriptEnabled can introduce XSS vulnerabilities into your application, review carefully

 這個錯誤訊息是 Lint 警告,提醒你 啟用 JavaScript 可能會導致 XSS(跨站腳本攻擊),但這不是編譯錯誤,你仍然可以執行程式。


為什麼 setJavaScriptEnabled(true) 會有安全問題?

  1. XSS(跨站腳本攻擊)

    • 如果 WebView 加載的是不受信任的內容(如網頁 URL),惡意腳本可能會被執行,進而竊取用戶資訊。

  2. 惡意網站可執行 JavaScript

    • 若用戶點擊某個惡意連結,該網站可以透過 JavaScript 讀取本機存儲的資料,或執行惡意行為。

  3. 可能影響應用程式的安全性

    • WebView 本身沒有「沙箱機制」,若載入外部網站並允許 JavaScript,可能會讓應用程式暴露在安全風險之下。


如何安全地使用 setJavaScriptEnabled(true)

如果你確定要啟用 JavaScript,請確保:

  1. 只載入受信任的內容

    • 避免載入外部 URL,建議只顯示 本地 HTML(assets 內)可信的網站

    kotlin
    webView.loadUrl("file:///android_asset/local_page.html")
    • 若一定要載入外部 URL,可限制允許的網域

    kotlin
    private val ALLOWED_DOMAINS = listOf("example.com", "trusted-site.com") private fun isUrlAllowed(url: String): Boolean { return ALLOWED_DOMAINS.any { domain -> url.contains(domain) } } webView.webViewClient = object : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { val url = request?.url.toString() return if (isUrlAllowed(url)) { false // 允許載入 } else { Log.w("WebView", "Blocked loading: $url") true // 阻擋載入 } } }
  2. 禁止 JavaScript 內的 window.open

    • 防止惡意網站開啟新窗口執行攻擊:

    kotlin
    webView.settings.javaScriptCanOpenWindowsAutomatically = false
  3. 停用 file 協議,防止本地文件讀取漏洞

    • 這樣可以避免 JavaScript 讀取你的應用程式內部檔案:

    kotlin
    webView.settings.allowFileAccess = false webView.settings.allowContentAccess = false
  4. 防止 JavaScript 透過 WebView 與 App 互動

    • 避免使用 addJavascriptInterface,這可能會讓惡意 JavaScript 竊取用戶資料。

    • 如果一定要使用,請加上 @JavascriptInterface,並確保方法內不執行敏感操作:

    kotlin
    class JavaScriptInterface { @JavascriptInterface fun showToast(message: String) { // 只允許應用內部邏輯使用 } } webView.addJavascriptInterface(JavaScriptInterface(), "AndroidInterface")

如何忽略這個 Lint 警告?

如果你確保 JavaScript 安全可用,且不想看到這個警告,可以:

  1. setJavaScriptEnabled(true) 上加入註解(不建議)

    kotlin
    @SuppressLint("SetJavaScriptEnabled") webView.settings.javaScriptEnabled = true

    ⚠ 注意:這只是忽略警告,並不會修正潛在的安全風險!

  2. lint.xml 內忽略這個警告(如果你的團隊確定要這樣做)

    xml
    <issue id="SetJavaScriptEnabled"> <ignore path="app/src/main/java/com/example/MyWebViewActivity.java" /> </issue>

結論

這個警告只是提醒你 setJavaScriptEnabled(true) 可能帶來 XSS 風險,如果你的 WebView: ✅ 只載入受信任的內容
不允許未知網站開啟新窗口
不允許讀取本地文件
不使用 addJavascriptInterface 與 JavaScript 互動
那麼這個設定是相對安全的,你可以放心使用。

如果你是開發 WebView App(如內嵌瀏覽器),還是建議 考慮使用 Custom Tabs,這樣能提高安全性,並讓系統瀏覽器處理 JavaScript。

沒有留言:

張貼留言

excel 最大值用max,取最小值但要排除0,要怎麼寫?

 =MIN(IF(A1:A10<>0, A1:A10))