最近我的一个应用程序收到了来自Google Play的安全警报,如下所示。
您的应用正在使用HostnameVerifier的不安全实施。有关修复漏洞和截止日期的详细信息,请参阅Google Play Help Center文章的链接。
以下是我的代码。
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
public boolean verify(String arg0, SSLSession arg1) {
return true;
}});
任何人都可以通过示例解释一下,我应该采取哪些措施来修复此警告?
答案 0 :(得分:5)
相同 - 在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
。注意:HostNameVerifier.setDefaultHostnameVerifier()
不应该像您的代码一样返回true
!它必须实现一些逻辑来检查它是否都可以使用SSL并返回true或false。这很重要。
答案 1 :(得分:4)
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
public boolean verify(String arg0, SSLSession arg1) {
return true;
}});
此代码有效地从您的连接中删除了对HTTPS的保护。你需要删除它。
禁用主机名验证允许网络上的任何人通过执行中间人攻击来查看和篡改您的网络流量。
答案 2 :(得分:3)
请检查我的代码我只验证了我的应用使用的域名。在您的代码中,您必须验证应用使用的所有域。 我使用了我的服务器和 Fabric.com ,所以我的代码在
之下HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession arg1) {
if (hostname.equalsIgnoreCase("api.my.com") ||
hostname.equalsIgnoreCase("api.crashlytics.com") ||
hostname.equalsIgnoreCase("settings.crashlytics.com")) {
return true;
} else {
return false;
}
}
});
答案 3 :(得分:0)
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier()
{
@Override
public boolean verify(String hostname,SSLSession arg1)
{
if (! hostname.equalsIgnoreCase("www.asdasdad.com"))
return true;
else
return false;
}
});
它有效
答案 4 :(得分:0)
答案 5 :(得分:0)
如果您使用 Braintree 进行 Paypal 付款。
Unsafe implementation of the HostnameVerifier interface - Google policy violation
也可能由最新的 Braintree 凭据更新引起。
请在 build.gradle(Project)
旧凭据
url "https://cardinalcommerce.bintray.com/android"
username 'braintree-team-sdk@cardinalcommerce'
password '220cc9476025679c4e5c843666c27d97cfb0f951'
新凭据
allprojects {
repositories {
google()
jcenter()
maven {
url "https://cardinalcommerceprod.jfrog.io/artifactory/android"
credentials {
username 'braintree_team_sdk'
password 'AKCp8jQcoDy2hxSWhDAUQKXLDPDx6NYRkqrgFLRc3qDrayg6rrCbJpsKKyMwaykVL8FWusJpp'
}
}
}
}
如果您使用的是 Google Play Services Gradle 插件,您还需要将其添加到 build.gradle 以避免依赖项解析问题:
components.all {
allVariants {
withDependencies { deps ->
deps.each { dep ->
if (dep.group == 'net.minidev' && dep.name =='json-smart') {
dep.version {
prefer "2.3"
}
dep.because "resolving dependencies issue"
}
}
}
}
}
StackOverflow:Braintree Drop-in UI: ERROR: Failed to resolve: org.jfrog.cardinalcommerce.gradle:cardinalmobilesdk:2.2.1-2?
相关的 Git 线程: https://github.com/braintree/braintree-android-drop-in/issues/219