问题引入
App
提交Google Play
时,审核被拒,打回,信息如下:
本文面向的是在应用中采用不安全的
HostnameVerifier
接口实施方式的开发者。在与使用[setDefaultHostnameVerifier](https://docs.oracle.com/javase/7/docs/api/javax/net/ssl/HttpsURLConnection.html#setDefaultHostnameVerifier%28javax.net.ssl.HostnameVerifier%29)
API
的远程主机建立HTTPS
连接时,这种实施方式会接受所有主机名,从而使您的应用容易受到中间人攻击。攻击者可能会读取传输的数据(例如登录凭据),甚至更改通过HTTPS
连接传输的数据。
从 2017 年 3 月 1 日起,只要新应用或应用更新采用的 HostnameVerifier
的实施方式不安全,一律禁止在 Google Play
发布。您已发布的APK
版本不会受到影响,但是,如果不解决此漏洞,您将无法为应用发布任何更新。
解决方案
需要执行的操作
为了正确处理主机名验证,请更改您的自定义 HostnameVerifier
接口中的验证方法,指定在服务器的主机名不符合您的预期时返回 False。
so,关键点就在这了,不要使用默认的HostnameVerifier
或者直接return true
,错误示例如下:
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
正确校验如下:
private static String[] VERIFY_HOST_NAME_ARRAY = new String[]{};
public static final HostnameVerifier createInsecureHostnameVerifier() {
return new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
if (TextUtils.isEmpty(hostname)) {
return false;
}
return !Arrays.asList(VERIFY_HOST_NAME_ARRAY).contains(hostname);
}
};
}
可以在VERIFY_HOST_NAME_ARRAY
中添加要校验的hostname
,当然也可以直接copy
上述代码,绕过GP
的验证。
后续步骤
使用上文中突出显示的步骤更新应用。
登录 Developer Console
并提交应用的更新版本。
过 5 个小时后再回来查看。如果应用未正确更新,系统将会显示相应的警告消息。
如有其他技术问题,您可以在 Stack Overflow
上发帖咨询(使用“android-security”
标签)。请注意,请勿在 Stack Overflow
上发布关于Play
政策的问题。
请注意,应用还必须遵循开发者分发协议和内容政策。如果您认为自己不应收到这则漏洞警告消息,请通过Google Play
开发者帮助中心与我们的政策支持团队联系。