如何防止H5应用被二次打包到恶意App中?

萌新.建云 阅读 2

我做的一个移动端H5项目,最近发现被人嵌入到第三方App里了,用户数据可能被中间人窃取。有没有办法检测或阻止这种二次打包行为?

试过用window.navigator.userAgent判断是否在自家App里,但对方直接伪造了UA字符串,根本防不住。

也听说可以通过校验页面来源或者和原生层通信做验证,但具体怎么实现?比如在WebView加载时让原生传个token之类的?

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
宇文奕诺
核心思路是让原生层传一个带签名的动态token,H5用公钥验证签名是否来自正版App。光判断UA没用,签名伪造难度高多了。

原生端(Android)示例:

webView.addJavascriptInterface(new Object() {
@JavascriptInterface
public String getSecureToken() {
long timestamp = System.currentTimeMillis();
String raw = "app_id" + timestamp + "salt_key";
String sign = RSA.sign(raw, privateKey); // 用App私钥签名
return timestamp + "." + sign;
}
}, "NativeBridge");


H5端验证:

// 页面加载时立即验证
(async () => {
if (typeof NativeBridge === 'undefined') {
// 不在App内或被hook了
location.href = 'https://yourdomain.com/blocked';
return;
}

const token = NativeBridge.getSecureToken();
const [ts, sig] = token.split('.');

// 校验时间戳(5分钟内有效)
if (Date.now() - parseInt(ts) > 5 * 60 * 1000) {
location.href = 'https://yourdomain.com/blocked';
return;
}

// 服务端二次验证签名
const res = await fetch('/api/verify-token', {
method: 'POST',
body: JSON.stringify({ ts, sig })
});

if (!res.ok) location.href = 'https://yourdomain.com/blocked';
})();


关键点:私钥嵌在Appso里,H5只存公钥用来验签,恶意App拿不到私钥就没法伪造token。加上时间戳限制,就算被拖了旧token也很快失效。服务端再验一道更稳妥。
点赞
2026-03-10 19:11