Android Webview Java和Javascript安全互動
最近要對一個網頁的原始碼進行檢測,Android Webview中沒有直接獲取網頁原始碼的介面,傳統的addJavascriptInterface
方法存在安全隱患,所以研究了一下Java和Javascript的安全互動。
Android Webview漏洞
Android Webview有兩個非常知名的漏洞:
- 最近爆出來的UXSS漏洞,可以越過同源策略,獲得任意網頁的Cookie等資訊,Android 4.4以下都有此問題,基本無解,只能重新編譯瀏覽器核心解決,詳情可以參考最近移動安全三兩事,感興趣的可以去看一下@RAyH4c劫持微博、QQ空間的視訊。
- 成名已久的任意命令執行漏洞,通過
addJavascriptInterface
方法,Js可以呼叫Java物件方法,通過反射機制,Js可以直接獲取Runtime,從而執行任意命令。Android 4.2以上,可以通過宣告@JavascriptInterface
保證安全性,4.2以下不能再呼叫addJavascriptInterface
,需要另謀他法。
Java和Javascript安全互動
首先要說明幾點:
1.Android Webview中Java呼叫Js方法很容易,loadUrl("javascript:isOk()")
就可以呼叫isOk這個Js方法,但不能直接獲取Js方法的返回結果。
2.傳統的方法中,Js獲取Java資訊可以採用如下方式:
class JsObject {
@JavascriptInterface
public String toString() { return “injectedObject”; }
}
webView.addJavascriptInterface(new JsObject(), “injectedObject”);
webView.loadData(“”, “text/html”, null);
webView.loadUrl(“javascript:alert(injectedObject.toString())”);
Java獲取Js資訊(如通過Js獲取網頁原始碼)可以這樣:
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;public class HtmlSource extends Activity {
private WebView webView;@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webView = (WebView)findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new InJavaScriptLocalObj(), “local_obj”);
webView.setWebViewClient(new MyWebViewClient());
webView.loadUrl(“http://www.cnblogs.com/hibraincol/”);
}
final class MyWebViewClient extends WebViewClient{
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d(“WebView”,”onPageStarted”);
super.onPageStarted(view, url, favicon);
}
public void onPageFinished(WebView view, String url) {
Log.d(“WebView”,”onPageFinished “);
view.loadUrl(“javascript:window.local_obj.showSource(‘<head>’+” +
“document.getElementsByTagName(‘html’)[0].innerHTML+’</head>’);”);
super.onPageFinished(view, url);
}
}final class InJavaScriptLocalObj {
public void showSource(String html) {
Log.d(“HTML”, html);
}
}
}
3.當網頁中有超連結跳轉時,將會呼叫WebClient的shouldOverrideUrlLoading
方法,若設定 WebViewClient 且該方法返回 true,則說明由應用的程式碼處理該 url,WebView 不處理,就可以達到攔截跳轉的效果。
明白了上面幾點,我們可以總結出一個比較安全的Java和Js互動方式:
可以借鑑Android Intent的思路,Java和Js定義一個url格式如
js://_
,Java呼叫Js方法,在Js方法中通過window.location.href='js://_?key=value#key1=value1'
模擬跳轉,被Java的shouldOverrideUrlLoading
捕獲,函式的返回值可以放在url的引數中。(Js呼叫Java方法原理相同)
這樣的互動方式是非同步的,如果你想知道呼叫一個Js方法是否返回了值怎麼辦?一般Java呼叫Js方法是在onPageFinished
方法中,獲得Js返回值是在shouldOverrideUrlLoading
方法中,兩個方法有個共同的引數webview,所以可以首先webview.setTag(false)
,如果捕獲到返回結果,則webview.setTag(true)
,postDelayed在很短時間比如300毫秒後,webview.getTag()
檢查是否有變化即可。
相關文章
- Android WebView —— Java 與 JavaScript 互動總結AndroidWebViewJavaScript
- Android 原生 WebView 與 JavaScript 互動AndroidWebViewJavaScript
- android 的webView載入h5,和h5的互動(java和JavaScript的互動)AndroidWebViewH5JavaScript
- Android中Java和JavaScript互動AndroidJavaScript
- Android混合開發之WebView與Javascript互動AndroidWebViewJavaScript
- Android webview JS 互動AndroidWebViewJS
- Android webview 與 js(Vue) 互動AndroidWebViewJSVue
- Android與WebView資料互動AndroidWebView
- iOS高階-WebView & JavaScript互動(附DEMO)iOSWebViewJavaScript
- WebView深度學習(一)之WebView的基本使用以及Android和js的互動WebView深度學習AndroidJS
- WKWebView和WebView與JS的互動方式WebViewJS
- webview與JS的互動WebViewJS
- WebView和js的互調WebViewJS
- Android在WebView中載入HTML並實現互動AndroidWebViewHTML
- Android 與WebView中的js程式碼的互動記錄AndroidWebViewJS
- JavaScript和CSS的互動方法JavaScriptCSS
- Android:是時候掌握WebView與Js的互動技術了AndroidWebViewJS
- flutter和Android原生互動FlutterAndroid
- Flutter使用JsBridge與WebView互動FlutterJSWebView
- Flutter WebView與JS互動簡易指南FlutterWebViewJS
- WebView與APP互動實戰記錄WebViewAPP
- Android混合開發之WebViewJavascriptBridge實現JS與java安全互動AndroidWebViewJavaScriptJS
- Android Webview和ScrollView衝突和WebView使用總結AndroidWebView
- 5種JavaScript和CSS互動的方法JavaScriptCSS
- 最全面總結 Android WebView與 JS 的互動方式(含例項Demo)AndroidWebViewJS
- WebView與JS的互動,以及注意事項WebViewJS
- android WebView詳解,常見漏洞詳解和安全原始碼AndroidWebView原始碼
- Android 原生和 JS 互動實踐AndroidJS
- Android 與 JavaScript 互動 支援的資料型別AndroidJavaScript資料型別
- webview js和java相互呼叫WebViewJSJava
- JavaScript和Objective-C互動的那些事JavaScriptObject
- 開啟 Android WebView 的安全瀏覽模式AndroidWebView模式
- Android WebView:這是一份 詳細 & 易懂的WebView學習攻略(含與JS互動、快取構建等)AndroidWebViewJS快取
- Android-Java 和 JavaScript 相互呼叫AndroidJavaScript
- Android 和 Webview 如何相互 sayHello(一)AndroidWebView
- react native ScrollView巢狀WebView 互動問題React Native巢狀WebView
- Android WebView安全方面的一些坑AndroidWebView
- iOS開發-javaScript互動iOSJavaScript