You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebView应用因Intent Scheme漏洞遭Google Play拒审,求排查shouldOverrideUrlLoading相关问题

WebView应用因Intent Scheme漏洞遭Google Play拒审,求排查shouldOverrideUrlLoading相关问题

兄弟,我太懂这种被拒审又摸不着头脑的憋屈了!你的情况我之前帮朋友排查过几乎一模一样的,核心就是Google对WebView处理Intent Scheme的安全要求卡得特别严,尤其是shouldOverrideUrlLoading这个方法,稍不留神就会踩“Intent Scheme Hijacking”的坑。

先给你掰扯清楚为啥Google会卡这个:简单说就是如果你的WebView没做严格限制,恶意网页可以通过构造特殊的intent://链接,唤起你App里的敏感组件,甚至跳转到其他恶意App,Google怕这个风险会坑到用户,所以直接拒审。

接下来给你列几个shouldOverrideUrlLoading里最容易踩的坑,你对着自己的代码排查就行:

  • 没做任何限制就直接跳转Intent:比如你是不是拿到网页传的链接,不管是不是intent://开头,直接就调用startActivity(intent)了?这种写法绝对会被Google的检测工具揪出来,恶意链接随便就能劫持跳转。
  • 没过滤非HTTP/HTTPS的Scheme:WebView本来就该主要处理网页链接(HTTP/HTTPS),其他Scheme(比如intent、market、tel这些)都要严格管控。如果是你业务必须要处理的(比如跳应用市场评分),一定要加白名单,只允许你明确信任的Scheme和目标包名。
  • 没验证Intent的跳转目标:哪怕是合法的Intent Scheme,也要检查跳转的组件是不是你自己App的,或者是你完全信任的第三方App。比如不能随便让一个Intent跳去陌生包名的App,这就是劫持风险。
  • 重载方法没全覆盖:别忘了shouldOverrideUrlLoading有两个版本(适配不同Android版本),如果你的App兼容低版本,两个方法都要加同样的安全逻辑,不能只写新的那个。

给你贴个我常用的安全写法参考,你可以对照着改自己的代码:

@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    String url = request.getUrl().toString();
    return handleUrlLoading(url);
}

// 兼容旧版本的重载方法
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    return handleUrlLoading(url);
}

private boolean handleUrlLoading(String url) {
    // 优先处理HTTP/HTTPS链接,让WebView正常加载
    if (url.startsWith("http://") || url.startsWith("https://")) {
        return false;
    }

    // 处理其他Scheme的情况
    if (url.startsWith("intent://")) {
        try {
            Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
            // 只允许跳转到自己App的组件,替换成你的包名
            if (intent.getComponent() != null && "com.your.app.package".equals(intent.getComponent().getPackageName())) {
                startActivity(intent);
            } else {
                // 非信任的Intent直接拦截,给用户提示
                Toast.makeText(this, "无法打开该链接", Toast.LENGTH_SHORT).show();
            }
        } catch (URISyntaxException e) {
            e.printStackTrace();
            // 解析失败直接拦截
            return true;
        }
        return true;
    }

    // 其他非必要的Scheme全部拦截
    Toast.makeText(this, "无法打开该链接", Toast.LENGTH_SHORT).show();
    return true;
}

你先把自己的shouldOverrideUrlLoading逻辑按这个思路理一遍,把所有非白名单内的Intent跳转都堵住,再提交应该就能过审了。毕竟Google的检测工具就是模拟各种恶意链接来试探你的WebView安全逻辑,只要逻辑严谨就没问题。

备注:内容来源于stack exchange,提问作者Nullfi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:28:18