Google Play Security Alert - ваше приложение использует небезопасную реализацию HostnameVerifier
недавно один из моих приложений получил предупреждение безопасности от Google Play, как показано ниже.
вы приложение использует небезопасную реализацию HostnameVerifier. И ссылка на Справочный Центр Google Play статья для деталей относительно к фиксировать и крайнему сроку уязвимости.
Ниже приведен мой код.
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
public boolean verify(String arg0, SSLSession arg1) {
return true;
}});
кто-нибудь может объяснить с примером о том, какие изменения я должен сделать, чтобы исправить это предупреждение?
5 ответов
то же самое здесь-небезопасный верификатор имени хоста, обнаруженный в APK
ваше приложение использует небезопасную реализацию HostnameVerifier. Пожалуйста см. эту статью справочного центра Google для деталей, включая крайний срок для исправления уязвимости. Im не использует HostnameVerifier и не вызывает setDefaultHostnameVerifier. Более того-Im с использованием OKHTTP lib для http-запросов. Я надеюсь, что определение 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
}
и, наконец, Google говорит:
СКАНИРОВАНИЕ ЗАВЕРШЕНО
Для APK 158 не обнаружено известных уязвимостей.
однако я не уверен, какой код сделал это,HostNameVerifier
или onReceivedSslError()
of mWebView.setWebViewClient
. Примечание:HostNameVerifier.setDefaultHostnameVerifier()
не должна возвращать true
всегда, как это в коде! Он должен реализовать некоторую логику, чтобы проверить, все ли в порядке с SSL и вернуть true или false. Это необходимо.
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
public boolean verify(String arg0, SSLSession arg1) {
return true;
}});
этот код эффективно удаляет защиту HTTPS из ваших соединений. Вы должны удалить его.
отключение проверки имени хоста позволяет любому в сети просматривать и вмешиваться в сетевой трафик, проводя человека в середине атаки.
пожалуйста, проверьте мой код у меня есть только проверенные домены, которые использует мое приложение. В коде необходимо проверить все домены, используемые приложением. Я использовал свой сервер и 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;
}
}
});
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier()
{
@Override
public boolean verify(String hostname,SSLSession arg1)
{
if (! hostname.equalsIgnoreCase("www.asdasdad.com"))
return true;
else
return false;
}
});
Он работает
на консоли Google play перейдите к управлению выпуском - > выберите версию apk - > вкладка Безопасность. Там вы увидите список проблем безопасности с этим apk вместе с классом в вашем коде, который вызывает эту проблему безопасности, где это возможно.