Javascript:为长查询准备的语句

Javascript:为长查询准备的语句,javascript,mysql,Javascript,Mysql,我正试图保护我的游戏不受SQL注入的影响,我已经读到使用准备好的语句是实现这一点的一种方法,如下所示: var userId = 5; var query = connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) { //query.sql returns SELECT * FROM users WHERE id = '5' }); 但是当我的SQL看起来像这样时,我该怎么

我正试图保护我的游戏不受SQL注入的影响,我已经读到使用准备好的语句是实现这一点的一种方法,如下所示:

var userId = 5;
var query = connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {
  //query.sql returns SELECT * FROM users WHERE id = '5'
});
但是当我的SQL看起来像这样时,我该怎么做呢

let sql = `INSERT INTO ${table} (prefix_id, suffix_id, identifier_index, username, hashbrown, salt, date_created, date_updated) 
                SELECT ${args.prefix_id}, ${args.suffix_id}, COALESCE(MAX(identifier_index) + 1, 1), CONCAT(${args.username}, COALESCE(MAX(identifier_index) + 1, 1)),
                ${args.hash}, ${args.salt}, NOW(), NOW() from ${table} where prefix_id = ${args.prefix_id} AND suffix_id = ${args.suffix_id}`;
现在,因为这将最终进入AWS Lambda和API网关,我不想使用第三方节点库或可能会损坏的东西

有什么想法吗?

您尝试过:

const query = connection.query(
    `INSERT INTO ${table} (prefix_id, suffix_id, identifier_index, username, hashbrown, salt, date_created, date_updated) 
            SELECT ?, ?, COALESCE(MAX(identifier_index) + 1, 1), CONCAT(?, COALESCE(MAX(identifier_index) + 1, 1)),
            ?, ?, NOW(), NOW() from ${table} where prefix_id = ? AND suffix_id = ?`,
    [
        args.prefix_id,
        args.suffix_id,
        args.username,
        args.hash,
        args.salt,
        args.prefix_id,
        args.suffix_id
    ],
    function(err,results) {
        //
    }
);

您不应该在客户端构建查询,只需将数据传递到服务器端,然后根据传递(和检查)的数据构建查询。或者这实际上是一个nodejs问题?您不能使用prepared语句动态绑定表名,因此纯prepared语句对您来说不是一个解决方案。最大的问题是:所有的参数来自哪里?顺便说一句,prepared语句是官方MySQL API提供的一种功能。node.js MySQL connector仅使用此功能。@Shadow,如果需要,可以对表名进行硬编码。准备好的语句可以工作吗?是的,在这种情况下,准备好的语句可以工作。那么表名呢?如果它们不能作为参数传递,那么您可以将它们作为表达式保留在模板文本中,但根据预定义的列表或模式检查它们的有效性。或者您需要能够处理任何表名吗?有问题吗它将所有的转义都转换为一个tilde(`),这与SQL不匹配(它认为该值是一列)。我把所有的车都翻了??虽然您可能需要更新您的答案,但所有这些都很好。