继承关系

java.lang.Object
继承者 android.os.Handler
继承者 android.webkit.SslErrorHandler

问题方法

cancel( )

停止加载问题页面

proceed( )

忽略SSL证书错误,继续加载页面

触发条件:
1. 调用SslErrorHandler类的proceed方法
【1】对应到smali语句中的特征:Landroid/webkit/SslErrorHandler;->proceed()V
2. 方法名:onReceivedSslError

Android WebView组件加载网页发生证书认证错误时,会调用WebViewClient类的onReceivedSslError方法,如果该方法实现调用了handler.proceed()来忽略该证书错误,则会受到中间人攻击的威胁,可能导致隐私泄露

修复

  1. 不调用android.webkit.SslErrorHandler的proceed方法
  2. 当发生证书认证错误时,采用默认的处理方法SslErrorHandler.cancel(),停止加载问题页面

Cordova问题代码

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

final String packageName = parentEngine.cordova.getActivity().getPackageName();
final PackageManager pm = parentEngine.cordova.getActivity().getPackageManager();

ApplicationInfo appInfo;
try {
appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
// debug = true
//handler.proceed(); 这里是问题代码
handler.cancel();
return;
} else {
// debug = false
super.onReceivedSslError(view, handler, error);
}
} catch (NameNotFoundException e) {
// When it doubt, lock it out!
super.onReceivedSslError(view, handler, error);
}
}