【问题标题】:MySQL NodeJS prepared statement on INSERTING OR UPDATING table name?MySQL NodeJS 准备好插入或更新表名的语句?
【发布时间】:2021-05-18 17:53:28
【问题描述】:

这是我要执行的代码:

connection.query({
sql: 'CREATE TABLE ? ( `wage` FLOAT NOT NULL , `monday` FLOAT NOT NULL , `tuesday` FLOAT NOT NULL , `wednesday` FLOAT NOT NULL , `thursday` FLOAT NOT NULL , `friday`) ENGINE = InnoDB;',
timeout: 40000, // 40s
},
//[arg1],
function (error, results, fields) {

if (error) {
console.log("Table creation failed");
}else{
console.log("Table creation success");
}

}

);

这不是一个准备好的语句,因为它需要它并将它放在引号中,这意味着语句看起来像这样:

CREATE TABLE 'test' ( `wage` FLOAT NOT NULL , `monday` FLOAT NOT NULL , `tuesday` FLOAT NOT NULL , `wednesday` FLOAT NOT NULL , `thursday` FLOAT NOT NULL , `friday`) ENGINE = InnoDB;

这是无效的

所以我不得不写这样的语句:

connection.query({
sql: 'CREATE TABLE '+arg1+' ( `wage` FLOAT NOT NULL , `monday` FLOAT NOT NULL , `tuesday` FLOAT NOT NULL , `wednesday` FLOAT NOT NULL , `thursday` FLOAT NOT NULL , `friday` FLOAT NOT NULL) ENGINE = InnoDB;',
timeout: 40000, // 40s
},
//[''],
function (error, results, fields) {

if (error) {
console.log("Table creation failed");
}else{
console.log("Table creation success");
}

}

);

这行得通,但它现在让我面临 SQL 注入,这是我试图避免的。

有什么办法可以解决这个问题并使用准备好的语句?

https://www.npmjs.com/package/mysql - 这是我使用的包

【问题讨论】:

  • 不可能将对象名称作为表名或列名作为参数传递,因此您只能使用动态 sql .. 为避免 sqliject,您必须提供适当的字符串纯化 .. 为此 ee 特定功能由您的代码语言提供
  • 如果我想传递表名,如何确保它已准备好?

标签: javascript mysql node.js npm


【解决方案1】:

您可以使用“??”转义查询标识符或 connection.escapeId()。

https://www.npmjs.com/package/mysql#escaping-query-identifiers

【讨论】:

    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2015-02-26
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多