【发布时间】: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 似乎解决了问题