如何在Sequelize的Prepared Statements中对SQL注入参数抛出错误
在Sequelize中检测SQL注入并主动抛出错误
首先明确:Sequelize的replacements参数本身会自动对传入值做转义,从根源上避免SQL注入执行。但如果需要主动检测参数是否包含注入特征并抛出错误,而非仅靠框架自动处理,可按以下方式实现:
1. 编写SQL注入特征校验函数
实现一个函数,检测参数是否包含常见的SQL注入关键字或恶意语句:
function isSqlInjection(value) { const injectionPatterns = [ /('|")\s*OR\s*('|")('|")/i, // 匹配如 ' OR ''=' 这类注入语句 /UNION\s+SELECT/i, /DROP\s+TABLE/i, /INSERT\s+INTO/i, /UPDATE\s+.+\s+SET/i, /DELETE\s+FROM/i, /EXEC\s+\(/i, /--\s*$/i, // 匹配SQL注释符结尾 /;\s*$/i // 匹配语句结束符结尾 ]; return injectionPatterns.some(pattern => pattern.test(value.toString())); }
2. 在查询前校验参数并抛出错误
调用sequelize.query前,先对传入的参数做校验,一旦检测到注入特征直接抛出错误:
const query = "select distinct c.id from categories c where eventId=?"; let eventId = 123; // 此处为可能的用户输入参数 // 校验参数是否存在SQL注入风险 if (isSqlInjection(eventId)) { throw new Error("参数包含非法SQL注入内容"); } try { const response = await db.sequelize.query(query, { replacements: [eventId], type: Sequelize.QueryTypes.SELECT }); return response; } catch (err) { // 处理查询过程中的其他异常 throw err; }
额外优化建议
- 可根据业务需求扩展正则表达式的检测规则,但要注意避免误判正常业务参数。
- 若参数应为数字类型,可先强制转换(如
eventId = Number(eventId)),非数字直接抛出错误,进一步缩小注入风险范围。 - 不要关闭Sequelize的自动转义机制,主动校验+自动转义形成双重安全保障。
内容的提问来源于stack exchange,提问作者Xiao
相关产品推荐
相关产品推荐

