今天我收到了Google发来的这封电子邮件:
此电子邮件末尾列出的您的应用不安全 HostnameVerifier接口的实现,接受所有接口 与远程主机建立HTTPS连接时的主机名 setDefaultHostnameVerifier API,从而使您的应用程序易受攻击 对中间人的攻击。攻击者可以读取传输的数据 (例如登录凭证),甚至更改传输的数据 HTTPS连接。
可悲的是,我搜索了所有代码,发现没有使用HostnameVerifier,也没有使用setDefaultHostnameVerifier甚至任何HTTPS连接!
我在其最新版本:25.0.1中使用Google兼容性库,在我的某些应用中使用Google Ads 9.8.0。将广告升级到10.0.1,因为我只能假设罪魁祸首在那里?!
有没有人收到此提醒,如果有,你是如何解决的?
答案 0 :(得分:1)
相同 - 在APK
中检测到不安全的主机名验证程序您的应用正在使用HostnameVerifier的不安全实现。请 有关详细信息,请参阅此Google帮助中心文章,其中包括 修复漏洞的截止日期。我没有使用HostnameVerifier 而不是调用setDefaultHostnameVerifier。而且 - 我使用OKHTTP 用于http请求的lib。我希望定义TrustManager能解决 这个问题。
由于我没有继承HostnameVerifier
或调用setDefaultHostnameVerifier()
,我认为它依赖于某些第三方lib。由于我无法检测到这样的lib,我想我会尝试添加一个包含以下代码的类
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(final String hostname, final SSLSession session) {
if (check if SSL is really valid)
return true;
else
return false;
}
});
到我的项目,看看它是否解决了这个问题 所以我做了它,除了每个webView我都添加了重写方法
@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
// the main thing is to show dialog informing user
// that SSL cert is invalid and prompt him to continue without
// protection: handler.proceed();
// or cancel: handler.cancel();
String message;
switch(error.getPrimaryError()) {
case SslError.SSL_DATE_INVALID:
message = ResHelper.getString(R.string.ssl_cert_error_date_invalid);
break;
case SslError.SSL_EXPIRED:
message = ResHelper.getString(R.string.ssl_cert_error_expired);
break;
case SslError.SSL_IDMISMATCH:
message = ResHelper.getString(R.string.ssl_cert_error_idmismatch);
break;
case SslError.SSL_INVALID:
message = ResHelper.getString(R.string.ssl_cert_error_invalid);
break;
case SslError.SSL_NOTYETVALID:
message = ResHelper.getString(R.string.ssl_cert_error_not_yet_valid);
break;
case SslError.SSL_UNTRUSTED:
message = ResHelper.getString(R.string.ssl_cert_error_untrusted);
break;
default:
message = ResHelper.getString(R.string.ssl_cert_error_cert_invalid);
}
mSSLConnectionDialog = new MaterialDialog.Builder(getParentActivity())
.title(R.string.ssl_cert_error_title)
.content(message)
.positiveText(R.string.continue_button)
.negativeText(R.string.cancel_button)
.titleColorRes(R.color.black)
.positiveColorRes(R.color.main_red)
.contentColorRes(R.color.comment_grey)
.backgroundColorRes(R.color.sides_menu_gray)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(MaterialDialog materialDialog, DialogAction dialogAction) {
mSSLConnectionDialog.dismiss();
handler.proceed();
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(MaterialDialog materialDialog, DialogAction dialogAction) {
handler.cancel();
}
})
.build();
mSSLConnectionDialog.show();
}
到
mWebView.setWebViewClient(new WebViewClient() {
... // other corresponding overridden methods
}
最后谷歌说:
安全扫描完成
没有检测到APK 158的已知漏洞。
但是,我不确定代码是什么,HostNameVerifier
或onReceivedSslError()
mWebView.setWebViewClient
。
答案 1 :(得分:0)
根据从Google收到的邮件,此问题可能有两种可能性:
主要是您必须检查您的包裹名称是否使用Google限制的任何关键字。例如" com.companyname。 android ",不允许使用.android。次要是检查HostNameVerifier
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(final String hostname, final SSLSession session) {
if (/* check if SSL is really valid */)
return true;
else
return false;
}
});