【问题标题】:NodeJS + PostgreSQL: INSERT has more target columns than expressionsNodeJS + PostgreSQL:INSERT 的目标列多于表达式
【发布时间】:2016-06-07 21:14:08
【问题描述】:

我想在每个新用户注册时使用CURRENT_TIMESTAMPINSERT 当前时间戳。列号等于VALUES 中的参数数量。然而我得到INSERT has more target columns than expressions。使用node-postgres npm 模块作为控制器。

                         //Just 3 parameters, timestamp is hardcoded in the query
exports.create = function (username, email, password) {
    DB.connect(connection, function (err, client, done) {
        var query = client.query(

    //4 columns 
    "INSERT INTO users (username, email, userpass, datecreated) VALUES" +
    //4 parameters
    "(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "'" + "'CURRENT_TIMESTAMP')");
        query.on('error', function (error) {
            console.log("query returned an " + error);
        });
        query.on('row', function (row, result) {
            result.addRow(row);
        });
    });
};

【问题讨论】:

  • 在我看来,您正在传递 Current_Timestamp 的字符串值;不调用函数 current_timestamp。也许你需要去除它周围的抽动。看看here 怎么没有抽动症?
  • 删除它周围的单引号返回syntax error at or near CURRENT_TIMESTAMP
  • 我会将整个字符串写入一个变量,然后显示变量的结果。我的猜测是你在其他地方有语法错误......
  • 不要使用此代码。它非常不安全,并且也会导致一些用户输入难以调试数据库错误。阅读有关 SQL 注入的信息。

标签: javascript sql node.js postgresql


【解决方案1】:

密码后缺少逗号,并且 current_Timestamp 周围没有抽动

"INSERT INTO users (username, email, userpass, datecreated) VALUES" +
    //4 parameters
    "(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "," + "'CURRENT_TIMESTAMP)"

--- 虽然这可能是解决当前问题的公认答案,但我强烈建议评估 Craig 和 Lars 的答案。使用参数是一种更好的长期方法,因为它更安全;一旦你了解了如何以及正确的现代范式,实际上更容易编码。

【讨论】:

    【解决方案2】:

    我之前的答案是基于提供的旧代码,它不再准确,因此我将其删除。

    passwordCURRENT_TIMESTAMP 之间缺少逗号 ,

    我建议你使用 parameterized queries 而不是像这样自己构建它们。

    【讨论】:

    • 有一个datecreated 列用于目的^
    • + 超越了答案,而不仅仅是解决眼前的问题。
    【解决方案3】:
    `"(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "'" + "'CURRENT_TIMESTAMP')"`
    

    非非非非!

    这不是您传递参数的方式,这可能是您遇到问题的原因。 (xQbert 指出您还缺少逗号)。

    想象一下,如果我输入了用户名

    ');--DROP TABLE users;--
    

    喷溅。 There goes your application.

    通过绑定参数使用parameterized queries占位符。这通常被称为“准备好的陈述”,尽管它们确实有所不同。

    例如

    client.query(
        "INSERT INTO users (username, email, userpass, datecreated) VALUES ($1, $2, $3, current_timestamp)",
        [username, email, password])
    

    你的问题会消失的。

    Now read this.

    请注意,这不仅仅是一个安全问题,它也是一个错误,即使是非恶意用户也会导致错误。我输入了一个看起来很安全的密码,例如94/Ql@$'B'wC。 Boom,您的应用因数据库错误而崩溃。

    【讨论】:

    • + 超越了答案,而不仅仅是解决眼前的问题。
    • 新程序员不断产生明显的 SQL 注入漏洞,这让我一直感到沮丧。必须有一些方法来改进驱动程序文档、语言等。人们只是继续这样做,而 SQL-injection-whack-a-mole 并不是保护应用程序的好方法。啊。每当我看到它出现时,我都会尝试提出这个问题,希望更多的人会搜索错误,找到这些类型的答案,并意识到“嗯,所以我的整个应用程序非常不安全和错误?那么最好修复它。”
    猜你喜欢
    • 2019-08-15
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2017-04-20
    • 2015-02-22
    • 2020-09-17
    • 2020-01-19
    相关资源
    最近更新 更多