将字段值注入节点中的sql查询中

问题描述 投票:1回答:1

我正在以下节点中运行SQL查询:

connection.query(`update foodplan set ? = ? where id = ?;`, [meal, favouriteChoice, idValue],
        function (err) {
            if (err) throw err;
            else console.log('Successful update');
        });

价值餐可以是“早餐”,“午餐”或“晚餐”-这些是foodplan表中的3个字段值。但是,当运行此命令时,出现以下错误:

“错误:您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以获取在第1行的“ dinner” =“ wraps”(其中id =“ 24”附近)附近使用的正确语法”

任何人都知道怎么了吗?

sql node.js sql-update sql-injection
1个回答
2
投票

查询参数不仅仅是执行字符串替换的另一种方法。参数占位符?保留为占位符,直到解析SQL之后。 SQL引擎只是记住,“哦,这里将提供一个值。”

这就是为什么它可以作为SQL注入的修复程序-无论最终将什么作为参数值传递,SQL引擎都不会将其视为单个值。

不是列名,不是任何其他种类的标识符,不是表达式,不是SQL关键字,等等。

但是由于这个原因,您不能使用参数代替列名。仅代替单个值。

您必须阐明所有SQL语法,表达式,标识符等。之前解析SQL。否则,解析器将无法验证您的语法,确认存在该名称的列以及您有权查询该列。

抱歉,但是您必须将列名放入查询字符串中,不能将其作为参数。

所以你问:

有什么方法可以使这项工作而不必编写单独的查询来插入早餐,午餐和晚餐?

使用字符串连接来形成SQL查询是安全的。if保证字符串是安全的。在这种情况下,您可以确保列名“早餐”,“午餐”和“晚餐”被列入白名单并且在代码的控制下,并且不允许使用任何不受信任的输入。

© www.soinside.com 2019 - 2024. All rights reserved.