【问题标题】:Syntax error in SQL when inserting data via nodejs通过nodejs插入数据时SQL中的语法错误
【发布时间】:2021-01-17 20:49:27
【问题描述】:

我在 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 服务器版本,以便使用正确的语法 在第 1 行的 '{JSON.stringify(steps.trigger.event.body.email)})' 附近 PromiseConnection.execute (/tmp/ee/node_modules/mysql2/promise.js:110:22) 在 进程中的 Object.module.exports (/steps/mysql.js:14:41)._tickCallback (内部/进程/next_tick.js:68:7)

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

TypeError [ERR_INVALID_ARG_TYPE]第一个参数必须是类型之一 字符串、缓冲区、ArrayBuffer、数组或类似数组的对象。已收到 类型未定义

【问题讨论】:

  • 如果你想使用template literals,你必须使用` 而不是" 符号作为你的字符串
  • 我被困了 2 天......谢谢它的工作......
  • 不要使用模板文字来注入数据。使用占位符值。定义查询字符串时远离模板字符串以避免这种诱惑..

标签: mysql sql node.js mariadb pipedream


【解决方案1】:

这是一个经典的 SQL 注入 bug,using prepared statements 很容易修复:

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

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

使用JSON.stringify 进行SQL 保护是,我怎么强调都不为过,完全不合适。这会转义 JSON 和 only JSON。如果出现这种情况,您必须使用特定于 SQL 的转义函数,但尽可能使用带有占位符值的预准备语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2019-11-26
    • 1970-01-01
    • 2019-02-09
    • 2018-09-20
    • 2014-05-25
    相关资源
    最近更新 更多