mysql - 通过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 类型之一。接收类型未定义
解决方案
这是一个经典的 SQL 注入错误,可以通过使用准备好的语句轻松修复:
const [rows, fields] = await connection.execute(
"INSERT INTO Testing (Email) VALUES (?)",
[ steps.trigger.event.body.email ]
);
如果您编写的查询没有数据,只是占位符,并使用这样的方法通过驱动程序将数据添加到查询中,您将不会创建任何 SQL 注入错误。这些是一种极其严重的错误形式,因为如果发现一个错误,可能会给您、您的项目和您所从事的任何业务带来灾难性的后果。
用于
JSON.stringify
SQL 保护是,我不能强调这一点,完全和非常不合适。这会转义 JSON,并且只转义JSON。如果出现这种情况,您必须使用特定于 SQL 的转义函数,但尽可能使用带有占位符值的预准备语句。
推荐阅读
- swift - 无法在 Xcode 预览上构建活动方案
- logging - 如何在 Azerothcore 中启用多个 Server.log(s)
- python - 一次性从单链表中删除第 k 个最后一个元素
- arrays - 如何计算 F# 中锯齿状数组中的元素数?
- java - 在 Arrayadapter 制作的 listView 中执行 setOnItemClickListener
- java - 如何渲染具有特定视野的图像?
- javascript - Fullcalendar Angular - Tooltip.js CSS 未应用(CSS 封装问题)
- php - 如何限制特定的谷歌用户可以读/写谷歌表?
- javascript - 如何将 HTML5 画布作为图像存储在框架列表中?
- javascript - 如何创建跨浏览器多范围滑块?(没有 jQuery)