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 вместе с классом в вашем коде, который вызывает эту проблему безопасности, где это возможно.

enter image description here