首页 > 解决方案 > 通过nodejs插入数据时SQL中的语法错误

问题描述

我在 pipedream 中有一个简单的 nodejs 代码,它将正文电子邮件发送到 mySQL 数据库。我已经检查了与数据库的连接及其工作。这是我的代码

const mysql = require('mysql2/promise');

const { host, port, username, password, database } = auths.mysql

const connection = await mysql.createConnection({
  host,
  port,//3306
  user:"u648845344_demo",
  password,
  database,
});

const [rows, fields] = await connection.execute(
  "INSERT INTO Testing (Email) VALUES (${JSON.stringify(steps.trigger.event.body.email)})"
  );
console.log(rows);
//console.log(${JSON.stringify(steps.trigger.event.body.email)})

我得到的错误

错误您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在 PromiseConnection.execute (/tmp/ee/node_modules) 的第 1 行的“{JSON.stringify(steps.trigger.event.body.email)}) 附近使用正确的语法/mysql2/promise.js:110:22) 在 Object.module.exports (/steps/mysql.js:14:41) 在 process._tickCallback (internal/process/next_tick.js:68:7)

我尝试在控制台日志上收到电子邮件,但我收到的错误是

TypeError [ERR_INVALID_ARG_TYPE]第一个参数必须是 string、Buffer、ArrayBuffer、Array 或 Array-like Object 类型之一。接收类型未定义

标签: mysqlsqlnode.jsmariadbpipedream

解决方案


这是一个经典的 SQL 注入错误,可以通过使用准备好的语句轻松修复:

const [rows, fields] = await connection.execute(
  "INSERT INTO Testing (Email) VALUES (?)",
  [ steps.trigger.event.body.email ]
);

如果您编写的查询没有数据,只是占位符,并使用这样的方法通过驱动程序将数据添加到查询中,您将不会创建任何 SQL 注入错误。这些是一种极其严重的错误形式,因为如果发现一个错误,可能会给您、您的项目和您所从事的任何业务带来灾难性的后果。

用于JSON.stringifySQL 保护是,我不能强调这一点,完全和非常不合适。这会转义 JSON,并且转义JSON。如果出现这种情况,您必须使用特定于 SQL 的转义函数,但尽可能使用带有占位符值的预准备语句。


推荐阅读