【问题标题】:Sqlite unrecognized token when inserting hash into db将哈希插入数据库时​​Sqlite无法识别的令牌
【发布时间】:2018-12-01 22:49:45
【问题描述】:

长话短说,我正在对密码进行哈希处理并将其插入数据库中。大多数情况下它可以工作,但是我每隔一段时间就会收到一个无法识别的令牌错误,我无法弄清楚是什么原因造成的。这是一个特殊情况。

这是导致这些错误之一的语句

UPDATE Profiles SET Password = '|a¡è~©jÃQZ!ëg! (ªBìSóûÌõ»vî' WHERE UserName = 'ht999'

这是产生的 sql 错误

(unrecognized token: "'|a¡è~©jÃQZ!ëg!")

关于这个字符串是什么导致问题的任何想法?

【问题讨论】:

  • 这个问题在多个层面上都是错误的。她的一些:我真的怀疑你在你的程序中硬编码了这个 SQL,这意味着它是通过连接 SQL 关键字和数据来构造的。这很容易出现sql injection不要那样做!。其次,您以明文形式存储密码。尽管密码看起来非常好,但您缺少盐,这意味着您并没有真正存储hashed copy of the password不要那样做
  • 至于可能导致您所询问的特定错误的原因,您输入的字符串的编码可能会使 Sqlite 解析器出错。如果您使用参数而不是将密码添加为文字字符串,则此问题将消失。 那么做!
  • 不幸的是,我不能告诉你如何在 Sqlite 中使用参数,因为这取决于周围的平台、编程语言、Sqlite 库,可能还有其他东西。因此,确切的语法会有所不同,这取决于所有这些因素,可能还有更多因素。
  • TL;DR:使用参数而不是将值直接注入 SQL 语句文本。
  • 嗨 Lasse,首先非常感谢你的文章。为了简洁起见,我截断了很多代码。在我的项目中,基本上每次创建密码或重置密码时,我都会生成一个与密码连接的随机盐,然后生成哈希,然后将其与盐一起存储以备后用。这是你所描述的还是我错过了一步?还要感谢您对使用参数的提醒,我明白为什么它要好得多!也像您建议的那样,将字符串的编码从 ISO_8859_1 更改为 base64 似乎解决了问题

标签: sql sqlite


【解决方案1】:

我相信您的问题实际上不在于 SQLite/ 或显示的 SQL,而在于您用于运行 SQL 的任何工具,或者可能存在任何前面的 SQL(我可能省略了 ; 或者可能是无关的 ' 或其他封闭字符)。

这就是 SQL 本身的工作原理(使用 Navicat、DB Browser for Sqlite、SQLite Manager、SQLite Studio),即:-

DROP TABLE IF EXISTS Profiles;
CREATE TABLE IF NOT EXISTS Profiles (Username TEXT PRIMARY KEY,Password TEXT DEFAULT 'UNSETPASSWORD');
INSERT OR IGNORE INTO Profiles (Username) VALUES 
    ('ht001'),('ht950'),('ht999');
SELECT * FROM Profiles;
UPDATE Profiles SET Password = '|a¡è~©jÃQZ!ëg! (ªBìSóûÌõ»vî' WHERE UserName = 'ht999';
SELECT * FROM Profiles;

适用于以上所有并导致(根据 Navicat):-

更新后:-

更新前:-

【讨论】:

  • 感谢您抽出宝贵时间来做这件事,迈克。正如您所建议的,该问题一定与该特定的 sql 语句无关,而是与我在代码中如何形成它有关。我将字符串的编码更改为 base64,以防止出现“'”和“;”之类的任何字符避免出现在字符串中并干扰 sql 语句的语法。它现在可以正常工作了,再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多