如何在Node.JS中为MSSQL创建预准备语句?

时间:2017-09-13 03:31:46

标签: javascript sql-server node.js prepared-statement sql-injection

我需要将Javascript中定义的字符串插入到MSSQL表中。

这是我到目前为止所做的:

使用Javascript:

var message = "It's a great day today!";  
$.post('www.server.com/message='+message, function(response){
console.log(response);
});

Node.js服务器:

//..... a bunch of code has been used to accept the HTTP request and get the message...
// for the purpose of this example, the message is asigned to 'NodeMsg'
var mssqldb = require("../core/mssql"); 
var NodeMsg = theMessageReceivedFromHTTPRequest;
function saveMessage(message) {
    mssqldb.executeMssql("insert into messages (message, status) VALUES('"+message+"', 'new')", function (err) {
      if (err) {
        httpMsgs.show500(req, resp, err);
      }//end if
      else {
        httpMsgs.sendJson(req, resp, 'success');
      }//end else
    });
};

mssql.js(node.js文件):

var mssqldb = require("mssql");
var settings = require("../settings");

exports.executeMssql  = function(sql, callback) {
  var conn = new mssqldb.Connection(settings.mssqlConfig);
  conn.connect()
  .then(function(){
    var req = new mssqldb.Request(conn);
    req.query(sql)
    .then(function (recordset) {
      callback(recordset);
    })
    .catch(function(err){
      console.log(err);
      callback(null, err);
    });
  })
  .catch(function(err){
    console.log(err);
    callback(null, err);
  });
};//end executeMssql

发生了什么:

  1. 我将消息定义为字符串。 (请注意,它包含单引号)
  2. 我将该字符串发送到Node.js服务器
  3. 我使用Node.js将字符串发送到mssql
  4. 问题: 在了解了面向对象程序的更多信息之后,我逐渐意识到我执行插入的方式非常不受欢迎,因为它对SQL注入是开放的。此外,由于字符串中的单引号,代码将在执行SQL查询期间中断。

    解决方案: 根据我发现的大多数资源,解决方案是使用“准备好的陈述”。

    我的问题:

    我如何转换我已经完成的工作,利用准备好的陈述?我在网上搜索了HOURS,我找不到一个很好的例子,说明如何使用Node.JS为MSSQL(而不是MySQL)做一个准备好的语句,这对初学者来说是可理解的Node.Js

1 个答案:

答案 0 :(得分:0)

如果您使用的是繁琐的跨平台MSSQL驱动程序实现,则文档位于:http://tediousjs.github.io/tedious/parameters.html

基本上,您需要为需要注入的值准备一个带有'@xxx'占位符的SQL语句,然后将这些参数的实际值绑定到您的请求,然后执行您的请求。