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