如何使用 Node.JS 防止 SQL 注入?

2024-01-06

如何使用 Node.JS 选择 MS SQL Server 数据库的一行并防止 SQL 注入?我使用express框架和包mssql https://www.npmjs.com/package/mssql.

这是我现在使用的代码的一部分,可以使用 ES 6 编写 SQL 注入。

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 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 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Node.JS 防止 SQL 注入? 的相关文章

随机推荐