1
- 发布:2026-07-27 16:34
- 更新:2026-07-27 16:45
- 阅读:40
【报Bug】 DCSQLiteOpenHelper.java 的 createTableIfNotExists(db, str) 方法中,execSQL 仍用字符串拼接表名。
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: 1
HBuilderX类型: 正式
HBuilderX版本号: 5.07
手机系统: Android
手机系统版本号: Android 12
手机厂商: 华为
手机机型: 荣耀Magic7 PTP-AN00
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
操作步骤:
预期结果:
1
1
实际结果:
1
1
bug描述:
数据库注入漏洞
1.使用静态检测引擎对 APK 进行反编译。
2.反编译 DEX 后,检测 execSQL / rawQuery 参数中是否存在字符串 + 拼接变量。该方法体中 execSQL("CREATE TABLE IF NOT EXISTS " + str + " (...)" 会直接命中此规则,导致安全合规检测不通过。。
文件:io.dcloud.common.util.db.DCSQLiteOpenHelper.java
方法:createTableIfNotExists(db, str)
execSQL是用的字符串拼接的:
sQLiteDatabase.execSQL(
"CREATE TABLE IF NOT EXISTS " + str +
" (key TEXT PRIMARY KEY,value TEXT NOT NULL,timestamp TEXT NOT NULL)");
2 个回复
Ask小助手
感谢您的反馈。针对您提交的
DCSQLiteOpenHelper.java中execSQL使用字符串拼接表名导致安全合规检测不通过的问题,官方人员已对该 Bug 反馈进行了评审,具体分析与评价如下:1. Bug 反馈内容完整性分析
2. Bug 是否成立及处理建议
经核实知识库,该问题成立,但属于静态检测工具的误报范畴,分析如下:
createTableIfNotExists方法中,str变量代表的是表名。在 SQLite 的execSQLAPI 中,表名无法通过参数化查询(如?占位符)进行绑定,只能通过字符串拼接。且该表名由框架内部生成,并非来自外部不可信的用户输入,因此不存在实际的 SQL 注入风险。静态检测引擎仅通过“字符串拼接变量”这一特征进行匹配,导致了误报。结论与建议:
该 Bug 反馈属于静态扫描工具误报,并非框架存在真实的安全漏洞。如果您在进行应用上架或安全合规检测时遇到此类问题,建议您:
小龙喏 (作者)
3.8.0修复的是private void createTableIfNotExists(SQLiteDatabase db)方法,但是
private void createTableIfNotExists(SQLiteDatabase db, String str) {
// rawQuery 是参数化的
db.rawQuery("SELECT DISTINCT tbl_name FROM sqlite_master WHERE tbl_name = ?", new String[]{str});
}
方法还是有拼接
要回复问题请先登录或注册
公告
更多>相关问题