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

2024-03-01

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

您的应用程序正在使用不安全的实现主机名验证器 https://developer.android.com/reference/javax/net/ssl/HostnameVerifier.html。并参考链接Google Play 帮助中心 https://support.google.com/faqs/answer/7188426有关漏洞修复和截止日期的详细信息的文章。

下面是我的代码。

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

任何人都可以举例说明,我应该做哪些更改来修复此警告?


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

您的应用程序正在使用不安全的 HostnameVerifier 实现。请 请参阅这篇 Google 帮助中心文章了解详细信息,包括 修复漏洞的最后期限。我没有使用 HostnameVerifier 并且不调用 setDefaultHostnameVerifier。此外 - 我使用 OKHTTP http 请求的 lib。我希望定义 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;
    }
});

到我的项目,看看它是否解决了问题。
所以我做到了,此外,我还为每个 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(); 
}

to the

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

最后谷歌说:

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

不过我不确定是什么代码造成的,HostNameVerifier or onReceivedSslError() of mWebView.setWebViewClient. Note: HostNameVerifier.setDefaultHostnameVerifier()不应该返回true总是像你的代码一样!它必须实现一些逻辑来检查 SSL 是否一切正常并返回 true 或 false。这是必要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Play 安全警报 - 您的应用正在使用 HostnameVerifier 的不安全实现 的相关文章