You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:12:47