【发布时间】:2018-08-23 13:16:01
【问题描述】:
我正在端口 3000 上编写一个服务器,它的工作是从“Signup.ejs”输入的值中获取数据,然后将它们插入到数据库中。
一切都很好,但有一个问题,它告诉我 TechnoBoy 是 Field list 中的未知列
我尝试在 ${} 周围插入 "" 甚至 ``,但由于出现了新错误,因此效果不佳。
这是我的 Connection.js 文件,我使用它来创建连接,然后将其导出以将其连接到我的应用程序文件中:
let mysql = require("mysql");
let connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "something",
database: "test"
});
module.exports = connection;
这是我的 Server.js,我用它来创建服务器并连接到数据库,将数据插入其中:
let connection = require("./Connection.js");
let bodyParser = require("body-parser");
let express = require("express");
let app = express();
let urlencodedParser = bodyParser.urlencoded({ extended: false });
app.listen(3000, function() {
console.log("The server at port 3000 is open!");
});
app.set("view engine", "ejs");
app.get("/Signup", (req, res) => {
res.render("Register");
});
connection.connect();
app.post("/Signup", urlencodedParser, function(req, res) {
console.log(req.body);
res.render("Register");
connection.query(
`insert into users (Username, User_Password) values (${
req.body.Username
}, ${req.body.Password})`
);
});
我在输入字段中插入一些数据时收到错误:
Error: ER_BAD_FIELD_ERROR: Unknown column 'TechnoBoy' in 'field list'
at Query.Sequence._packetToError (C:\Users\ha\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
at Query.ErrorPacket (C:\Users\ha\node_modules\mysql\lib\protocol\sequences\Query.js:77:18)
at Protocol._parsePacket (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:278:23)
at Parser.write (C:\Users\ha\node_modules\mysql\lib\protocol\Parser.js:76:12)
at Protocol.write (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:38:16)
at Socket.<anonymous> (C:\Users\ha\node_modules\mysql\lib\Connection.js:91:28)
at Socket.<anonymous> (C:\Users\ha\node_modules\mysql\lib\Connection.js:502:10)
at Socket.emit (events.js:182:13)
at addChunk (_stream_readable.js:283:12)
at readableAddChunk (_stream_readable.js:264:11)
--------------------
at Protocol._enqueue (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:144:48)
at Connection.query (C:\Users\ha\node_modules\mysql\lib\Connection.js:200:25)
at C:\Users\ha\OneDrive\Images\Documents\Projects\UI-Server\Server.js:17:14
at Layer.handle [as handle_request] (C:\Users\ha\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\ha\node_modules\express\lib\router\route.js:137:13)
at C:\Users\ha\node_modules\body-parser\lib\read.js:130:5
at invokeCallback (C:\Users\ha\node_modules\raw-body\index.js:224:16)
at done (C:\Users\ha\node_modules\raw-body\index.js:213:7)
at IncomingMessage.onEnd (C:\Users\ha\node_modules\raw-body\index.js:273:7)
at IncomingMessage.emit (events.js:182:13)
Emitted 'error' event at:
at Connection._handleProtocolError (C:\Users\ha\node_modules\mysql\lib\Connection.js:425:8)
at Protocol.emit (events.js:182:13)
at Protocol._delegateError (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:390:10)
at Query.<anonymous> (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:153:12)
at Query.emit (events.js:182:13)
at Query.Sequence.end (C:\Users\ha\node_modules\mysql\lib\protocol\sequences\Sequence.js:78:12)
at Query.ErrorPacket (C:\Users\ha\node_modules\mysql\lib\protocol\sequences\Query.js:90:8)
at Protocol._parsePacket (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:278:23)
at Parser.write (C:\Users\ha\node_modules\mysql\lib\protocol\Parser.js:76:12)
at Protocol.write (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:38:16)
我使用的查询(在 connection.query btw 中):
insert into users (Username, User_Password) values (${
req.body.Username
}, ${req.body.Password})
如果这是一个愚蠢的问题或其他问题,请原谅,我对后端很陌生,这是我第一次尝试。
【问题讨论】:
-
您能否提供导致此问题的 SQL 查询?我有一种奇怪的感觉,
TechnoBoy是用于Username列的值,您可能会遇到输入数据的 SQL 注入或错误处理。 -
我猜这是关于 #nodejs 的?然后请删除#javascript标签并添加#nodejs。
-
@Roland 哦,我已经写了我使用的查询是:插入用户(用户名,User_Password)值(${req.body.Username},${req.body.Password})是的, TechnoBoy 是一个用于 Username 列的值,我希望它记录在该列中。您对输入数据的错误处理是什么意思?对不起先生,我对服务器和数据库很陌生。
-
抱歉监督。对于“错误处理”,我的意思是不逃避来自互联网等不受信任来源的数据。因此,一般的好建议是在用户的输入数据到达任何敏感部分(如 SQL 查询)之前转义(“保护”)用户的输入数据,在这些部分中潜在的攻击者可以插入像 `OR 1=1` 这样的恶意代码。
-
我猜测这个的简单原因(不知道 NodeJS)是错误消息的状态:
Unknown column TechnoBoy in field list。这可能意味着您在 SQL 查询中缺少单个撇号。因为当您将它们排除在外并且 NodeJS 代码没有将其“智能”添加到其中时,值TechnoBoy将被插入到您的 SQL 语句中,从而导致INSERT INTO users (Username, User_password) VALUES (TechnoBoy, abc123#)。如果您在值周围使用',则TechnoBoy会被SQL 引擎解释为值,这就是您想要的。