Electron应用将源码存入SQLite后用new Function执行是否安全?
客户端存储回滚迁移代码的安全性分析与解决方案
你这种将回滚迁移代码存入客户端SQLite数据库,再通过new Function(sourceCodeTakenFromDatabase)()动态执行的做法完全不安全,核心风险和对应解决方案如下:
不安全的核心原因
- 客户端SQLite数据库完全处于用户可控范围,任何人都可以通过SQLite编辑工具直接修改数据库中存储的代码内容,注入恶意逻辑(比如窃取本地敏感数据、删除用户文件等),一旦触发回滚操作就会执行这些恶意代码。
new Function的执行逻辑和eval高度相似,执行的代码拥有当前应用的全部运行权限,能访问应用可触及的所有本地资源、用户数据,一旦被篡改,危害极大。
适配回滚迁移场景的安全措施
1. 代码签名验证
在将回滚迁移代码存入数据库前,用你方的私钥对代码生成数字签名,存储时同时保存签名和代码。执行回滚操作前,先用应用内置的公钥验证签名合法性,只有签名匹配的代码才允许执行,从根源上防止代码被篡改。
2. 替换动态执行为结构化操作描述
放弃存储可执行代码,改为存储回滚操作的结构化数据。比如把回滚需要完成的数据库操作(如删除指定表、还原字段类型、插入历史数据)用JSON或自定义格式序列化后存入数据库。回滚时,应用读取这些结构化数据,通过内置的安全执行器完成对应的数据库操作,彻底避免动态执行未知代码的风险。
3. 加密存储代码(次选方案)
如果必须存储可执行代码,对存入数据库的源码用AES对称加密算法加密,密钥需做混淆处理后内置在应用中(避免反编译轻易获取)。执行前先解密代码,再进行签名验证,最后执行,大幅提高恶意篡改的门槛。
4. 隔离执行上下文
若无法避免动态执行,需严格隔离代码的运行权限:
- 后端/桌面端环境:用沙箱模块(如Node.js的
vm模块)创建隔离上下文,仅授予代码必要的数据库操作权限,禁止访问文件系统、网络、进程等敏感资源。 - 前端环境:限制代码能访问的全局对象,禁止调用
fetch、localStorage等敏感API,仅保留回滚所需的数据库操作能力。
内容的提问来源于stack exchange,提问作者alexpopocoder
相关产品推荐
相关产品推荐

