Google Play安全警报 - 您的应用正在使用HostnameVerifier的不安全实施

Pri*_*tel 7 android google-play android-security

最近我的一个应用程序收到了来自Google Play的安全警报,如下所示.

您的应用程序正在使用HostnameVerifier的不安全实现.有关修复漏洞和截止日期的详细信息,请参阅Google Play帮助中心文章的链接.

以下是我的代码.

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

任何人都可以通过示例解释一下,我应该做些什么更改来修复此警告?

Ant*_*ony 5

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

此代码有效地从您的连接中删除了 HTTPS 保护。你需要删除它。

禁用主机名验证允许网络上的任何人通过进行中间人攻击来查看和篡改您的网络流量。


Sta*_*tan 5

此处相同-在APK中检测到不安全的主机名验证程序

您的应用使用了不安全的HostnameVerifier实现。请参阅此Google帮助中心文章以了解详细信息,包括修复漏洞的截止日期。我没有使用HostnameVerifier并且没有调用setDefaultHostnameVerifier。此外-我使用OKHTTP库进行http请求。我希望定义TrustManager可以解决此问题。

因为我没有继承HostnameVerifier或调用,setDefaultHostnameVerifier()所以我认为它依赖于某些第三方库。由于我无法检测到这样的库,我想我将尝试使用以下代码添加一个类

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;
    }
});
Run Code Online (Sandbox Code Playgroud)

到我的项目中,然后查看它是否可以解决问题。
所以我做到了,此外,我对每个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(); 
}
Run Code Online (Sandbox Code Playgroud)

到

mWebView.setWebViewClient(new WebViewClient() {
... // other corresponding overridden methods
}
Run Code Online (Sandbox Code Playgroud)

最后,谷歌说:

安全扫描
已完成未检测到APK 158的已知漏洞。

但是我不知道了哪些代码呢,HostNameVerifier还是onReceivedSslError()的mWebView.setWebViewClient。注意:HostNameVerifier.setDefaultHostnameVerifier()不应该true总是像代码中那样返回!它必须实现一些逻辑来检查SSL一切正常,然后返回true或false。这是必不可少的。


Ani*_*ani 5

请检查我的代码,我只验证了我的应用程序使用的域。在您的代码中,您必须验证您的应用程序使用的所有域。我已经使用了我的服务器和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;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)