Sequelize 7.0.0-alpha.4能否防范MySQL原生查询SQL注入及代码优化方案
关于Sequelize 7.0.0-alpha.4的SQL注入防范及原生查询改造方案
版本的SQL注入防范能力
Sequelize 7.0.0-alpha.4不会自动防范原生字符串拼接式查询的SQL注入风险——这类风险源于直接将未处理的动态值(比如用户输入)拼接到SQL语句中。但该版本支持参数化查询机制,只要正确使用就能有效规避SQL注入。
你的代码改造方案
你当前的硬编码SQL语句如果是固定值(比如示例中的name='xyz'和id=1)本身没有注入风险,但如果其中包含动态传入的用户输入,就必须改用参数化查询方式。改造方式有两种:
方式1:使用问号占位符
const query1 = `UPDATE Table SET name=? WHERE id=?`; const saveEditPost = await sequelizeWrite.query(query1, { type: sequelizeWrite.QueryTypes.UPDATE, replacements: ['xyz', 1] // 动态值全部放在这里,顺序对应占位符 });
方式2:使用命名参数(可读性更好)
const query1 = `UPDATE Table SET name=:name WHERE id=:id`; const saveEditPost = await sequelizeWrite.query(query1, { type: sequelizeWrite.QueryTypes.UPDATE, replacements: { name: 'xyz', id: 1 } // 键名对应SQL中的命名占位符 });
核心原理
通过replacements传递的参数会被Sequelize自动进行转义处理,避免恶意输入被解析为SQL指令。绝对不要直接将用户输入或其他动态值拼接到SQL字符串中,所有变量都通过参数化方式传递。
内容的提问来源于stack exchange,提问作者Rohit Tiwari
相关产品推荐
相关产品推荐

