語言

WebView.AddJavascriptInterface(Object, String) 方法

定義

將所提供的 Java 物件注入此 WebView。

[Android.Runtime.Register("addJavascriptInterface", "(Ljava/lang/Object;Ljava/lang/String;)V", "GetAddJavascriptInterface_Ljava_lang_Object_Ljava_lang_String_Handler")]
public virtual void AddJavascriptInterface(Java.Lang.Object object, string name);
[<Android.Runtime.Register("addJavascriptInterface", "(Ljava/lang/Object;Ljava/lang/String;)V", "GetAddJavascriptInterface_Ljava_lang_Object_Ljava_lang_String_Handler")>]
abstract member AddJavascriptInterface : Java.Lang.Object * string -> unit
override this.AddJavascriptInterface : Java.Lang.Object * string -> unit

參數

object
Object

將 Java 物件注入到這個 WebView 的 JavaScript 上下文中。 null 值會被忽略。

name
String

JavaScript 中用來暴露物件的名稱

屬性

備註

將所提供的 Java 物件注入此 WebView。 該物件會以所提供的名稱注入網頁的所有框架,包括所有 iframe。 這使得 Java 物件的方法可以從 JavaScript 存取。 針對 API 層 android.os.Build.VERSION_CODES#JELLY_BEAN_MR1 級及以上的應用程式,只有標 android.webkit.JavascriptInterface 註了 JavaScript 的公開方法才能存取。 針對 API 層 android.os.Build.VERSION_CODES#JELLY_BEAN 級或以下的應用程式,所有公開方法(包括繼承的)皆可存取,詳見下方重要安全說明以了解其影響。

請注意,注入的物件直到頁面下一次(重新)載入時才會出現在 JavaScript 中。 注入物件前應先啟用 JavaScript。 例如:

class JsObject {
               {@literal @}JavascriptInterface
               public String toString() { return "injectedObject"; }
            }
            webview.getSettings().setJavaScriptEnabled(true);
            webView.addJavascriptInterface(new JsObject(), "injectedObject");
            webView.loadData("<!DOCTYPE html><title></title>", "text/html", null);
            webView.loadUrl("javascript:alert(injectedObject.toString())");

<strong>重要:</strong><ul><li> 此方法可用來讓 JavaScript 控制主機應用程式。 這是一個強大的功能,但對於應用程式的 android.os.Build.VERSION_CODES#JELLY_BEAN 目標鎖定或更早階段來說,也存在安全風險。 針對更新 android.os.Build.VERSION_CODES#JELLY_BEAN 版本的應用程式,如果該應用程式運行在 Android 4.2 之前的裝置上,仍然存在漏洞。 使用此方法最安全的方法是針對 android.os.Build.VERSION_CODES#JELLY_BEAN_MR1 並確保只有在 Android 4.2 或更新版本運行時才會被呼叫。 在這些較舊版本中,JavaScript 可以使用反射來存取注入物件的公用欄位。 在包含不受信任內容的 WebView 中使用此方法,可能讓攻擊者以非預期的方式操控主機應用程式,並以主機應用程式的權限執行 Java 程式碼。 在可能包含不可信內容的 WebView 中使用此方法時,務必格外小心。</li><li> JavaScript 與 WebView 的私人背景執行緒中的 Java 物件互動。 因此必須謹慎以維持線程安全。 </li><li> 由於物件暴露於所有框架,任何框架都能取得物件名稱並呼叫該框架的方法。 無法從應用程式端判斷呼叫框架的來源,因此除非應用程式能保證即使在 iframe 內也不會載入第三方內容,否則不應假設呼叫者是可信賴的。</li><li> Java 物件的欄位無法存取。</li><li> 針對 API 層android.os.Build.VERSION_CODES#LOLLIPOP級及以上的應用程式,注入的 Java 物件方法可由 JavaScript 枚舉。</li></ul>

Java 文件 android.webkit.WebView.addJavascriptInterface(java.lang.Object, java.lang.String)

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

適用於