【问题标题】:Can't insert sha256 hash into SQLite3 table - NodeJs无法将 sha256 哈希插入 SQLite3 表 - NodeJs
【发布时间】:2020-02-01 16:08:41
【问题描述】:

我正在使用 SQLite3 和 NodeJs 创建一个 sha256 哈希表 尝试插入整数和随机哈希时,出现以下错误。

{ Error: SQLITE_ERROR: no such column: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 errno: 1, code: 'SQLITE_ERROR' }

这是创建数据并将数据插入表的来源

// * Create ~ Open Hashes Database
let db = new sqlite3.Database('./hashes.db', sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (e => {
  if (e) {
    console.log('Failed to open/create hashes database')
  }

  console.log('Successfully opened / created')
}));

const hash = crypto.createHash('sha256').digest('hex');

// * 1 Create Database
db.run("CREATE TABLE hashes(seq INTEGER PRIMARY KEY, hash VARCHAR(255) NOT NULL)", (e) => {
  if (e) return console.log(e);
  console.log('Created database')
});

db.run(`INSERT INTO hashes VALUES (1, ${hash})`, (e) => {
  if (e) return console.log(e);
  console.log("successfully inserted", 1, hash);
})

第 1 列 (Seq) 只是一个顺序递增的整数 (1,2,3....) 第二列是 VARCHAR 类型的哈希。

【问题讨论】:

  • 这个错误发生在表已经创建的时候?
  • 是的,它发生在创建表之后
  • 建表后是否只执行了数据插入部分没有建表部分?
  • 是的。如果我只运行插入代码,它会抛出该错误。只是为了澄清起见,错误中的哈希只是该运行期间刚刚生成的哈希 - 因为我使用的是 crypto.createHash()
  • 试试INSERT INTO hashes VALUES (1, "${hash}")

标签: sql node.js sqlite


【解决方案1】:

请上帝使用参数而不是字符串插值将动态值传递给查询。对于与any SQL 引擎交互的any 编程语言也是如此。字符串插值让您面临大量 sql 注入漏洞,请参阅https://bobby-tables.com/

这在 node sqlite3 API 中有明确记录和推荐:

https://github.com/mapbox/node-sqlite3/wiki/API#databaserunsql-param--callback

      db.run("UPDATE tbl SET name = ? WHERE id = ?", "bar", 2);

这相当于将值 "bar"2 分别替换了两个 ?


在你的情况下,应该这样做:

db.run("INSERT INTO hashes VALUES (1, ?)", hash, (e) => {
  if (e) return console.log(e);
  console.log("successfully inserted", 1, hash);
})

看起来更好、更简单、更安全。

请注意,我将反引号插值 `-string 更改为双引号 "-string。这是故意的。不要将值插值到 SQL 字符串中。

【讨论】:

    【解决方案2】:

    我认为问题是您在查询中直接使用哈希而不将其定义为字符串/varchar,因此 sqlite 认为它是一列。

    db.run(`INSERT INTO hashes VALUES (1, "${hash}")`, (e) => {
      if (e) return console.log(e);
      console.log("successfully inserted", 1, hash);
    })
    

    【讨论】:

    • 你真的应该对字符串文字使用单引号。虽然 sqlite 将接受如果有一个具有该名称的列可能无法工作 - 不太可能用于哈希,但仍然如此。 sqlite.org/…
    猜你喜欢
    • 2019-11-18
    • 2021-10-06
    • 2019-11-10
    • 2015-06-25
    • 2017-03-28
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多