继承关系
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()来忽略该证书错误,则会受到中间人攻击的威胁,可能导致隐私泄露
修复
- 不调用android.webkit.SslErrorHandler的proceed方法
- 当发生证书认证错误时,采用默认的处理方法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);
}
}