为了账号安全,请及时绑定邮箱和手机立即绑定

无法转义单引号

无法转义单引号

拉风的咖菲猫 2022-08-27 09:44:25
我正在尝试找出一种方法来转义我的“预建”SQL查询中的单引号,我将其发送到泛型函数(我的所有查询都使用它)。我尝试了转义npm插件,手动完成等。这是我构建查询的代码位,当我输入例如“it's”时,由于特殊字符,dataString会出错:exports.addEntry = (req, res, nomPage, nomTable, data) => {  Object.keys(data).forEach(function (k, id) {    console.log(data[k]);    if (data[k] != null) {      if (id > 0) {        columnString += `,`;        dataString += `,`;      }      columnString += `${[k]}`;      dataString += `'${data[k]}'`;    }  });  try {    if (!data) throw new Error("Input not valid");    if (data) {      var sqlQuery = `INSERT INTO ${nomTable} (${columnString}) VALUES (${dataString})`;      connect.connectDatabase(sqlQuery, (data, err) => { [...]我之前谈到的泛型函数是这样的:var sql = require("mssql"); var config = require("../settings").config; exports.connectDatabase = function (rawQuery, callback) {  var conn = new sql.ConnectionPool(config);  conn    .connect()    .then(function () {      var req = new sql.Request(conn);      req        .query(rawQuery)        .then(function (recordset) {          callback(recordset.recordset);        })我的计划是让查询只使用一个函数,而不是很多做几乎相同事情的函数。如果能提供帮助,将不胜感激。
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

构建此查询的方式正是您不想执行的操作。它使您对SQL注入完全开放。


若要避免此问题,需要参数化查询。这里的额外好处是,它将照顾所有逃跑。


下面是一个直接来自 MS 文档的示例,演示如何使用 SQL Server 的节点.js驱动程序执行参数化查询。


遵循此范例的代码将如下所示:


exports.addEntry = (req, res, nomPage, nomTable, data) => {

  Object.keys(data).forEach(function (k, id) {

    console.log(data[k]);

    if (data[k] != null) {

      if (id > 0) {

        columnString += `,`;

        dataString += `,`;

      }

      columnString += `${[k]}`;

      dataString += `@${data[k]}`;

    }

  });


  try {

    if (!data) throw new Error("Input not valid");

    if (data) {

      var sqlQuery = `INSERT INTO ${nomTable} (${columnString}) VALUES (${dataString})`;

      connect.connectDatabase(sqlQuery, (data, err) => { 

[...]

所有改变的是操作构造.dataString


请注意,您现在需要将参数馈送到命令执行中,以替换之前嵌入的数据。


查看完整回答
反对 回复 2022-08-27
?
皈依舞

TA贡献1851条经验 获得超3个赞

有几种方法可以做到这一点:1 - 替换方括号的冒号,这将创建一个字符串值数组,那么你只需要担心通过数组长度进行排序,这将增加你的处理时间,但如果你的应用程序不是太大,它不应该有太大的区别。

2 - 用于对字符串中的单引号进行转义或对双引号进行转义。\'\"

让我知道这是否有帮助,因为这是一个快速的答案。


查看完整回答
反对 回复 2022-08-27
  • 2 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信