亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android WebView控件捕獲用戶輸入的信息

2020-04-11 10:49:52
字體:
來源:轉載
供稿:網友

WebView可所謂是Android中最強大的控件之一,無所不能。
于是有這么一個需求,用戶在app之中內嵌的WebView中輸入帳號密碼的時候,App需要捕獲已經輸入的帳號密碼。

當用戶輸入帳號密碼,一般情況下會進行頁面轉跳,在頁面轉跳之前執行js腳本,通過js腳本來獲取這個帳號密碼的value值。要先獲取各個元素的class值,需要解析整個html頁面,那么我們可以重寫 onLoadResource 這個方法,代碼如下:

webview.setWebViewClient(new WebViewClient() {  @Override  public boolean shouldOverrideUrlLoading(WebView view, String url) {    view.loadUrl(url);    return false;  }  @Override  public void onLoadResource(WebView view, String url) {    getHtml();    Log.e("log-->", "onLoadResource-->>" + url);  }  @Override  public void onPageFinished(WebView view, String url) {  }});

上面這個方法在加載頁面資源時會調用,每一個資源(比如圖片)的加載都會調用一次。那么我們可以在這個方法里面執行注入的js腳本
先執行addJavascriptInterface方法,將一個java對象綁定到一個js對象中,代碼如下:

public class JavaScriptInterface {    String mPasswrod;    String mUsername;    @JavascriptInterface    public void getHTML(final String html) {      if (!TextUtils.isEmpty(html)) {        saveWebViewUserData.saveUserDataWebView(webview, html);      }    }    @JavascriptInterface    public void save_password(final String password) {      if (!TextUtils.isEmpty(password)){        LogUtils.e("received from js. password = " + password);        this.mPasswrod = password;        checkData(mUsername, mPasswrod);      }    }    @JavascriptInterface    public void save_username(final String username) {      if (!TextUtils.isEmpty(username)) {        LogUtils.e("received from js. username = " + username);        this.mUsername = username;        checkData(mUsername, mPasswrod);      }    }  }webview.addJavascriptInterface(new JavaScriptInterface(), "android");  private void getHtml() {    webview.loadUrl("javascript:window.android.getHTML('<html>'+document.body.innerHTML+'</html>');");  }

那么下面這句話執行完的結果將會返回到JavaScriptInterface中getHTML方法里面。也就是說通過綁定,js代碼調用了java代碼,并將整個html作為返回值返回,執行的是saveWebViewUserData.saveUserDataWebView(webview, html);

得到了包含class的html之后,就需要依次分析了,通常來說,一般輸入帳號密碼的頁面都含有 type=”password” 字樣。先判斷這個html頁面是否含有這個字樣,如果有,那么可能就是登錄頁面。

再判斷這個頁面的id,或者是classname是否包含password啦,pwd啦,或者什么其他和密碼有關的了,這個元素肯定就是密碼框了,再過濾掉頁面中其他的button,hidden,submit,checkbox等等,剩下的那一個肯定就是用戶名了;過濾代碼如下:(這里使用jsoup解析html獲取各個document,循環遍歷剔除不需要的元素)

public void saveUserDataWebView(WebView webView, String html) {    Document document = Jsoup.parse(html);    Elements elements = document.select("input");    boolean isContainsPassword = false;    for (Element element : elements) {      String type = element.attr("type");      if ("password".equals(type)) {        isContainsPassword = true;        break;      }    }    if (!isContainsPassword) {      return;    }    for (Element element : elements) {      String className = element.className();      String type = element.attr("type");      webView.post(new Runnable() {        @Override        public void run() {          LogUtils.e("this element id is = " + element.attr("id") + " type = " + type);          String id = element.attr("id");          if (filterData(type, id)) {            int handType = handleType(type);            if (handType == NONE) {              handType = handleId(id);              if (handType == NONE) {                handleClassName(className);              }            }            switch (handType) {              case PASSWORD:                if (id==null){                }else {                  savePasswordById(id, webView);                }                break;              case USERNAME:                if (id==null){                }else {                  saveUsernameById(id, webView);                }                break;              case NONE:                break;            }          }        }      });    }  }  private int handleClassName(String className) {    if (className == null) {      return ERROR;    }    if (className.contains("password")) {      return PASSWORD;    }    if (className.contains("captcha")) {      return ERROR;    }    return USERNAME;  }  private boolean filterData(String type, String id) {    if ("captcha".equals(type)) {      return false;    } else if ("login_vcode".equals(type)) {      return false;    } else if ("button".equals(type)) {      return false;    } else if ("hidden".equals(type)) {      return false;    } else if ("submit".equals(type)) {      return false;    } else if ("checkbox".equals(type)) {      return false;    } else if ("captcha".equals(id)) {      return false;    } else if ("inp_ChkCode".equals(id)) {      return false;    } else {      return true;    }  }  private int handleId(String id) {    if (id == null) {      return NONE;    }    if (id.contains("captcha")) {      return ERROR;    }    if (id.contains("password")) {      return PASSWORD;    }    if (id.contains("Phone")) {      return USERNAME;    }    if (id.contains("username")) {      return USERNAME;    }    if (id.contains("code")) {      return ERROR;    }    return USERNAME;  }  private int handleType(String type) {    if (type == null) {      return NONE;    }    if (type.contains("tel")) {      return ERROR;    }    if (type.contains("pwd")) {      return PASSWORD;    }    if (type.contains("password")) {      return PASSWORD;    }    return NONE;  }

將他們倆的class id記錄下來,再次通過js代碼獲取到頁面的value值,調用java代碼保存下來。代碼如下:

private void saveUsernameById(String id, WebView webView) {   webView.loadUrl("javascript:window.android.save_username(document.getElementById('" + id + "').value)"); } private void savePasswordById(String id, WebView webView) {   webView.loadUrl("javascript:window.android.save_password(document.getElementById('" + id + "').value)"); }

經過上面簡單的處理,已經大致可以獲取到用戶輸入的帳號密碼了,經過測試,簡單的頁面中的帳號密碼是可以獲取到的,其他復雜的(如密碼在轉跳時清空了,又傳值到其他地方進行運算的)需要再根據不同的方案來對付了。

轉跳前先獲取整個頁面的html,用jsoup獲取頁面的所有class name,遍歷各個節點,剔除無用內容(驗證碼按鈕等),判斷密碼框在哪,剩下的可能就是帳號了,執行js代碼獲取value值。

以上就是本文的全部內容,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91影院在线免费观看视频| 色综合91久久精品中文字幕| 亚洲精品乱码久久久久久按摩观| 国精产品一区一区三区有限在线| 久久午夜a级毛片| 国产区精品在线观看| 精品福利一区二区| 国产成人精品久久亚洲高清不卡| 国产一区二区三区在线播放免费观看| 欧美日韩国产一中文字不卡| 91老司机精品视频| 亚洲一区二区自拍| 精品一区二区三区四区在线| 久久久91精品国产一区不卡| 欧美日韩成人在线播放| 国产一区二区三区在线免费观看| 亚洲精品国产电影| 伊人久久久久久久久久久| 亚洲国内高清视频| 亚洲国产精品99| 亚洲成人亚洲激情| 精品女厕一区二区三区| 欧美夫妻性生活xx| 国产97在线|亚洲| 久久色在线播放| 欧美富婆性猛交| 日韩亚洲第一页| 欧美激情在线视频二区| 欧美成人免费网| 亚洲精品97久久| 国产91在线播放九色快色| 久久精品电影网站| 国产不卡在线观看| 国产剧情日韩欧美| 日韩成人小视频| 国内免费精品永久在线视频| 亚洲欧美国产一区二区三区| 日韩动漫免费观看电视剧高清| 欧美午夜精品久久久久久人妖| 成人欧美一区二区三区黑人| 78m国产成人精品视频| 伊人精品在线观看| 国产一区二区三区在线| 在线观看日韩视频| 亚洲男人的天堂在线| 中文字幕av日韩| 日韩av大片在线| 国产精品旅馆在线| 亚洲成人黄色在线观看| 91精品久久久久久久| 91精品国产91久久久久久最新| 激情久久av一区av二区av三区| 插插插亚洲综合网| 欧美激情视频在线| 日韩一级裸体免费视频| 国语自产精品视频在线看| 成人性生交xxxxx网站| 亚洲成人动漫在线播放| 国产精品高潮呻吟久久av黑人| 亚洲网站视频福利| 欧美日韩在线视频一区二区| 在线观看国产精品淫| 成人精品一区二区三区电影免费| 国产精品久久久久久久久久新婚| 欧美日韩精品国产| 久久99精品久久久久久噜噜| 欧美日韩一区二区在线播放| 成人精品久久久| 91免费看片网站| 欧美亚洲伦理www| 亚洲欧美综合区自拍另类| 尤物tv国产一区| 欧美老妇交乱视频| 日本一区二区在线播放| 欧美另类极品videosbest最新版本| 国产精品美腿一区在线看| 九九热视频这里只有精品| 欧美乱妇40p| 日韩精品在线视频观看| 国模吧一区二区| 久久成人精品电影| 成人亚洲激情网| 久久精彩免费视频| 欧美成年人视频网站| 国产成人在线一区| 国产精品吴梦梦| 97**国产露脸精品国产| 97免费中文视频在线观看| 国产欧美日韩视频| 亚洲国产精品女人久久久| 91高潮精品免费porn| 欧美裸体xxxx极品少妇软件| 亚洲肉体裸体xxxx137| 亚洲综合在线做性| 国产精品国产三级国产aⅴ浪潮| 成人黄色av播放免费| 久久久综合免费视频| 久久久女人电视剧免费播放下载| 亚洲天堂男人的天堂| 成人a在线视频| 国语自产偷拍精品视频偷| 激情av一区二区| 午夜伦理精品一区| 久久精品夜夜夜夜夜久久| 国产一区二区三区四区福利| 日韩大片免费观看视频播放| 日韩激情视频在线播放| 国自产精品手机在线观看视频| 久久99热精品这里久久精品| 亚洲黄色有码视频| 黄色成人av在线| 日韩小视频在线观看| 丝袜美腿精品国产二区| 久久色精品视频| 91精品免费看| 午夜精品99久久免费| 国产深夜精品福利| 亚洲电影免费观看高清完整版在线观看| 中文字幕不卡av| 欧美色图在线视频| 国产欧美日韩视频| 亚洲国产精品va在线| 欧美亚洲激情在线| 韩国视频理论视频久久| 国产精品日韩在线一区| 91美女片黄在线观看游戏| 国产精品麻豆va在线播放| 欧美资源在线观看| 92看片淫黄大片欧美看国产片| 中日韩美女免费视频网址在线观看| 国产成人久久久| 亚洲综合大片69999| 成人免费视频网| 久久久久久久久久久免费精品| 久久精品成人一区二区三区| 青草青草久热精品视频在线观看| 欧美一乱一性一交一视频| 亚洲国产日韩欧美在线99| 国模视频一区二区| 17婷婷久久www| 1769国内精品视频在线播放| 欧美美女操人视频| 日韩欧美在线字幕| 久久精品色欧美aⅴ一区二区| 亚洲色图狂野欧美| 久久久免费在线观看| 色综合久久88| 国产精品久久久一区| 97免费中文视频在线观看| 国产精品女人久久久久久| 日韩精品免费在线| 欧美激情一区二区久久久| 欧美激情一区二区三区成人| 2019中文字幕免费视频| 亚洲第一页自拍| 亚洲a级在线播放观看| 欧美电影在线观看高清| 国产精品露脸自拍| 亚洲免费视频观看| 北条麻妃久久精品| 久久久久久欧美| 国产精品久久久久av| 91亚洲一区精品| 亚洲欧美另类国产|