前端怎么在移动端检测设备是否被Root了?

Top丶梓玥 阅读 14

我最近在做一款金融类的H5应用,产品要求对Root过的安卓设备做风险提示。但我查了一圈发现纯前端好像没法直接检测Root?试过用navigator.userAgent判断机型,但根本看不出是否Root。

也看过一些方案说可以尝试访问Root后才会有的系统路径,比如/system/bin/su,但用fetch请求这些路径要么跨域失败,要么被浏览器直接拦截。有没有实际可行的前端检测方法?还是说这种需求必须靠原生App或JSBridge来实现?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
设计师雨童
纯前端检测Root确实很困难,因为浏览器的安全限制会阻止你访问系统关键路径。我整理了几个相对靠谱的方案,按可行性排序:

1. 最靠谱的是通过JSBridge让原生App帮你检测,金融类App一般都有原生壳,让安卓同事写个接口返回是否Root的状态就行。比如:
window.NativeBridge.isRooted((isRooted) => {
if(isRooted) showWarning();
});


2. 如果一定要纯H5,可以试试检测非常规API或环境特征:
// 检查开发者工具是否被打开(间接判断)
const devToolsOpened = /./.test.toString().length > 100;

// 检查某些Root后才可写的系统属性
try {
const testProps = ['ro.debuggable', 'ro.secure'];
testProps.forEach(prop => {
if(new URL(file:///system/build.prop?${prop}=1).href) {
throw new Error('可能已Root');
}
});
} catch(e) {
console.log('检测到异常', e);
}


3. 还有个偏方是测执行时间,Root设备上某些系统调用会变慢:
const start = performance.now();
try { document.body.appendChild(document.createElement('div')); }
catch(e){}
const duration = performance.now() - start;
if(duration > 100) console.log('可疑设备');


实话实说,这些前端方案都不太准,很容易误判。真要靠谱还是得靠原生检测,我们之前项目最后就是让安卓端加了个接口解决的,毕竟金融类安全要求高。
点赞
2026-03-09 11:01