如何对sql.js输入做安全校验,防范Electron应用的SQL注入风险?
sql.js 防SQL注入的正确实现方式
直接用sql.js内置的**参数绑定(预处理语句)**功能即可从根源避免SQL注入,不要手动拼接用户输入到SQL语句中。
正确写法示例
sql.js的db.run()方法支持两种传参格式,会自动对输入值做转义处理:
1. 数组形式传参
按SQL语句中占位符的顺序传值即可:
const SQL = await sqljs(); const db = new SQL.Database(); let id = 1; let name = 'row name'; // 用?作为占位符,第二个参数传入值的数组 db.run(`INSERT INTO tableName VALUES (?, ?, ?);`, [id, name, 'hello']);
2. 命名参数形式传参
如果参数较多易混淆,可以用命名占位符(支持@、$、:前缀),传入对象绑定参数:
db.run(`INSERT INTO tableName VALUES ($id, $name, $extra);`, { $id: id, $name: name, $extra: 'hello' });
额外安全建议
- 不管参数类型是数字还是字符串,都统一走参数绑定,不要手动判断类型后拼接
- 涉及动态表名、字段名的场景(参数绑定不支持表名/字段名占位),可以预先定义允许的表名/字段名白名单,用户输入值匹配到白名单内的内容才允许拼接,禁止直接把用户输入作为表名/字段名插入SQL语句
- 严格控制Electron应用内数据库操作的权限,不要给前端渲染进程直接操作数据库的权限,所有数据库操作统一在主进程处理,渲染进程只传操作参数,主进程做参数校验后再执行SQL
内容的提问来源于stack exchange,提问作者Etsh
相关产品推荐
相关产品推荐

