在执行Google Play短信检索器进行双因素认证后,我们收到了以下违反政策的行为。在按照文档进行修复并重新提交后,它再次被拒绝。
步骤1:修复你的应用
违反策略的问题在审查过程中,我们发现你的应用程序…APK版本…,违反了设备和网络滥用策略:
我们不允许引入或利用安全漏洞的代码。查看应用程序安全改进计划,了解向开发人员标记的最新安全问题。您可以阅读设备和网络滥用策略页面,了解更多详细信息和常见违规示例。例如,你的应用包含一个意图重定向问题,它可以允许恶意应用访问私有应用组件或文件。
{包名称}.modules.smsuserconsent.c.onReceive
根据文档(https://support.google.com/faqs/answer/9267555),我们决定使用:选项2:
选项2:确保提取的意图来自可靠的来源。
您可以使用getCallingActivity之类的方法验证原始Activity是否可信。例如:
if (getCallingActivity().getPackageName().equals(“known”)) {
Intent intent = getIntent();
// extract the nested Intent
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// redirect the nested Intent
startActivity(forward);
}
注意:
- 检查getCallingActivity()返回的非空值是否不足以防止漏洞。恶意程序可以为这个函数提供一个空值。
- 在Google Play Services短信检索器认证的情况下,使用SEND_PERMISSION保护广播接收器将确保意图来自Play Services。
它明确地调用了我们的用例,并且通过传递SEND_PERMISSION,它应该足以解决策略违反。
这是我们的旧代码:
SmsRetriever.getClient(getCurrentActivity()).startSmsUserConsent(null);
broadcastReceiver = new SmsBroadcastReceiver(getCurrentActivity(), this);
getCurrentActivity().registerReceiver(
broadcastReceiver,
new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION)
);
这是我们的新代码:
SmsRetriever.getClient(getCurrentActivity()).startSmsUserConsent(null);
broadcastReceiver = new SmsBroadcastReceiver(getCurrentActivity(), this);
getCurrentActivity().registerReceiver(
broadcastReceiver,
new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION),
SmsRetriever.SEND_PERMISSION,
null,
0
);
我们是否仍然需要在onReceive中实现检查调用活动,或者我们没有正确实现SEND_PERMISSION ?
我们经历了多次失败的评审。在全面实施方案2和3后,我们最终通过了审查:
Intent consentIntent = extras.getParcelable(SmsRetriever.EXTRA_CONSENT_INTENT);
if (consentIntent == null) {
//handle error
return;
}
ComponentName name = this.activity.getCallingActivity();
int flags = consentIntent.getFlags();
if (name != null &&
name.getPackageName().equals("com.google.android.gms") &&
name.getClassName().equals("com.google.android.gms.auth.api.phone.ui.UserConsentPromptActivity") &&
flags & Intent.FLAG_GRANT_READ_URI_PERMISSION) == 0) &&
flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) == 0)) {
activity.startActivityForResult(consentIntent, SMS_CONSENT_REQUEST);
}