web-dev-qa-db-fra.com

Alerte de sécurité Google Play - Votre application utilise une implémentation non sécurisée de HostnameVerifier.

Récemment, une de mes applications a reçu une alerte de sécurité de Google Play, comme indiqué ci-dessous.

Votre application utilise une implémentation non sécurisée de HostnameVerifier . Et référez-vous à un lien vers Centre d'aide Google Play article pour plus de détails sur la correction et la date limite de vulnérabilité.

Ci-dessous mon code.

HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){ 
    public boolean verify(String arg0, SSLSession arg1) {
        return true;
}}); 

N'importe qui peut expliquer, à l'aide d'un exemple, quels changements dois-je effectuer pour résoudre cet avertissement?

6
Priyank Patel

Same here - Vérificateur de nom d'hôte non sécurisé détecté dans APK

Votre application utilise une implémentation non sécurisée de HostnameVerifier. Veuillez consulter cet article du centre d'aide Google pour plus de détails, y compris la date limite pour la correction de la vulnérabilité. Je n'utilise pas HostnameVerifier et n'appelle pas setDefaultHostnameVerifier. De plus - J'utilise OKHTTP lib pour les requêtes http. J'espère que la définition de TrustManager résoudra ce problème.

Étant donné que je ne sous-classe pas HostnameVerifier ni n’appelle setDefaultHostnameVerifier(), je suppose que cela dépend d’une librairie tierce. Comme je ne peux pas détecter une telle lib, je pense que je vais essayer d'ajouter une classe avec le code suivant

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;
    }
});

à mon projet et va voir si cela résout le problème.
Je l’ai donc fait et en plus de chaque méthode WebView, j’ai ajouté une méthode surchargée.

@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(); 
}

au

mWebView.setWebViewClient(new WebViewClient() {
... // other corresponding overridden methods
}

Et finalement, Google dit:

SCAN DE SÉCURITÉ COMPLET
Aucune vulnérabilité connue n'a été détectée pour APK 158.

Cependant, je ne suis pas sûr du code qui l'a créé, HostNameVerifier ou onReceivedSslError() of mWebView.setWebViewClient. Remarque: HostNameVerifier.setDefaultHostnameVerifier() ne devrait pas renvoyer true toujours comme dans votre code! Il doit mettre en œuvre une logique pour vérifier si tout est OK avec SSL et renvoyer true ou false. C'est essentiel.

4
Stan
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){ 
    public boolean verify(String arg0, SSLSession arg1) {
        return true;
}}); 

Ce code supprime efficacement la protection HTTPS de vos connexions. Vous devez le supprimer.

La désactivation de la vérification du nom d'hôte permet à quiconque sur le réseau de visualiser et d'altérer votre trafic réseau en effectuant une attaque au milieu.

4
Antimony

Veuillez vérifier mon code. Je n'ai vérifié que les domaines utilisés par mon application. Dans votre code, vous devez vérifier tous les domaines utilisés par votre application. J'ai utilisé mon serveur et Fabric.com mon code est ci-dessous

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;
        }
    }
});
2
frnd
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier()
    {
        @Override
        public boolean verify(String hostname,SSLSession arg1)
        {
            if (! hostname.equalsIgnoreCase("www.asdasdad.com"))
                return true;
            else
                return false;
        }
    });

Ça marche

1

Sur la console Google Play, allez dans Gestion des versions -> Sélectionnez la version d'apk -> onglet Sécurité. Vous y verrez une liste de problèmes de sécurité liés à cet apk, ainsi qu'une classe dans votre code, qui sont à l'origine de ce problème de sécurité dans la mesure du possible.

 enter image description here

0
Vinay Patil