如何防止 SQL 被 Node.JS 注入?
How can I prevent SQL injection with Node.JS?
我如何 select 一行 MS SQL 服务器数据库 Node.JS 防止 SQL 注入?我使用 express 框架和包 mssql
。
这是我现在使用的代码的一部分,有可能 SQL 用 ES 6 编写的注入。
const express = require('express'),
app = express(),
sql = require('mssql'),
config = require('./config');
let connect = (f, next) => {
sql.connect(config.database.connectionstring).then(f).catch((err) => {
next(err);
});
};
app.get('/locations/get/:id', (req, res, next) => {
let f = () => {
new sql.Request().query(`select * from mytable where id = ${req.params.id}`)
.then((recordset) => {
console.dir(recordset);
}).catch((err) => {
next(err);
});
};
connect(f, next);
});
使用 PreparedStatement。以下是文档中的操作方法 https://www.npmjs.com/package/mssql#prepared-statement :
var ps = new sql.PreparedStatement(/* [connection] */);
ps.input('id', sql.Int);
ps.prepare('select * from mytable where id = @id', function(err) {
ps.execute({id: req.params.id}, function(err, recordset) {
ps.unprepare(function(err) {
// ... error checks
});
// Handle the recordset
});
});
请记住,每个准备好的语句都意味着池中的一个保留连接。不要忘记取消准备准备好的语句!
您还可以在事务中创建准备好的语句 (new sql.PreparedStatement(transaction)),但请记住,在您调用 unprepare 之前,您不能在事务中执行其他请求。
文档是用 ES5 编写的,但我相信你可以 Promisify :)
我如何 select 一行 MS SQL 服务器数据库 Node.JS 防止 SQL 注入?我使用 express 框架和包 mssql
。
这是我现在使用的代码的一部分,有可能 SQL 用 ES 6 编写的注入。
const express = require('express'),
app = express(),
sql = require('mssql'),
config = require('./config');
let connect = (f, next) => {
sql.connect(config.database.connectionstring).then(f).catch((err) => {
next(err);
});
};
app.get('/locations/get/:id', (req, res, next) => {
let f = () => {
new sql.Request().query(`select * from mytable where id = ${req.params.id}`)
.then((recordset) => {
console.dir(recordset);
}).catch((err) => {
next(err);
});
};
connect(f, next);
});
使用 PreparedStatement。以下是文档中的操作方法 https://www.npmjs.com/package/mssql#prepared-statement :
var ps = new sql.PreparedStatement(/* [connection] */);
ps.input('id', sql.Int);
ps.prepare('select * from mytable where id = @id', function(err) {
ps.execute({id: req.params.id}, function(err, recordset) {
ps.unprepare(function(err) {
// ... error checks
});
// Handle the recordset
});
});
请记住,每个准备好的语句都意味着池中的一个保留连接。不要忘记取消准备准备好的语句!
您还可以在事务中创建准备好的语句 (new sql.PreparedStatement(transaction)),但请记住,在您调用 unprepare 之前,您不能在事务中执行其他请求。
文档是用 ES5 编写的,但我相信你可以 Promisify :)