MySQL PhpMyAdmin - 无法识别的关键字 CONCAT
Posted
技术标签:
【中文标题】MySQL PhpMyAdmin - 无法识别的关键字 CONCAT【英文标题】:MySQL PhpMyAdmin - Unrecognized Keyword CONCAT 【发布时间】:2017-04-06 06:56:36 【问题描述】:我正在练习使用 phpMyAdmin 在 mysql 中创建密码哈希表。我尝试输入的 SQL 代码是:
编辑:使用我正在使用的新代码:
INSERT INTO `user` (`username`, `salt`, `passwordhash`)
VALUES ('username', 'a1b2c3d4e5f6g', SHA2(CONCAT('password', 'a1b2c3d4e5f6g'), 256)));
在 SHA2 之后,一切都是错误的,第一个错误是“无法识别的关键字。(靠近 CONCAT)”。其余的都说“无法识别的令牌”,然后是任何字符串,所以看起来所有这些问题都是由 CONCAT 引起的。有没有其他方法可以连接字符串?
【问题讨论】:
你不应该使用 SHA1 password hashes 或 MD5 password hashes 而你真的应该使用 PHP 的built-in functions 来处理密码安全。确保你 don't escape passwords 或在散列之前对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。 您使用的是哪个 phpMyAdmin 和 MySQL 版本?一旦我更正了额外的右括号,这对我使用当前的 phpMyAdmin 版本(4.6.5.2)来说很好。 另外,您可以使用“插入”选项卡,其中包含可能对您有所帮助的 MySQL 函数下拉列表。 【参考方案1】:你应该有
查询中的错误 (1582):对本机的调用中的参数计数不正确 函数'SHA2'
这样对我有用
CREATE TABLE `user` (
`username` varchar(255) NOT NULL,
`salt` varchar(255) NOT NULL,
`passwordhash` varchar(255) NOT NULL
) ENGINE='InnoDB' COLLATE 'utf16_bin';
INSERT INTO `user` (`username`, `salt`, `passwordhash`)
VALUES ('username', 'a1b2c3d4e5f6g', SHA2('test',CONCAT('password', 'a1b2c3d4e5f6g')));
SELECT * FROM user;
username salt passwordhash
username a1b2c3d4e5f6g 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
username a1b2c3d4e5f6g 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
【讨论】:
感谢您的帮助。看起来问题确实出在 CONCAT 之类的东西上。它说 Unrecognized Keyword 及其下游的所有内容都是错误的。它还说明了第 99 位的右括号? (请参阅屏幕截图)。我已经尝试了该线程中所有建议的所有语法组合,但没有任何效果:/【参考方案2】:根据您的新代码:您有一个额外的括号,同样位于 , 256)));
。
这里:
INSERT INTO `user` (`username`, `salt`, `passwordhash`)
VALUES ('username', 'a1b2c3d4e5f6g', SHA2(CONCAT('password', 'a1b2c3d4e5f6g'), 256));
这个和我留在上面的所有 cmets。
编辑:根据SHA2()
上的 MySQL 手册,以下内容可能是一个相关问题。
根据https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_sha2
此功能仅在 MySQL 已配置 SSL 支持时有效。见Section 6.4, “Using Secure Connections”。 SHA2() 可以被认为在密码学上比 MD5() 或 SHA1() 更安全。 SHA2() 已在 MySQL 5.5.5 中添加。
因此,请确保您使用的 MySQL 版本与其匹配或更高。如果它低于 5.5.5,则 SHA2()
不可供您使用。那,或者它可能是服务器上的系统管理员/安全问题。
联系你学校的系统管理员,如果你是从那里运行这个的,就像你在 cmets 中所说的那样 - “我正在关注一个说使用 SHA2 的学校教程”。无论哪种方式,这里的 MySQL 版本都很重要。
要检查安装的 MySQL 版本,请在 phpmyadmin 中使用以下语法:
显示变量,例如“%version%”;
而不是您使用的 SELECT VERSION();
。
【讨论】:
这实际上不是原因。感谢您的帮助,但我复制并粘贴了每个人的不同答案,并尝试了任何可能有帮助的随机修复。你为我做了很多,而且显然知识渊博得多,但是当它不起作用时,请不要再告诉我接受你的答案。我可以诚实地理解您是否觉得这是在浪费您的时间,因为它最终可能会成为缓存问题(就像您上面所说的那样)。我要尝试重新登录。不过,真诚地感谢您的宝贵时间。 @NicholasHassan 我已经编辑了我的评论,你是对的。 @NicholasHassan 我不介意花时间提供帮助。我只是觉得很奇怪为什么你的 phpmyadmin 表现得如此奇怪。确保您的列类型和长度也正确。 登录退出重启后还是不行。我今天有一个教程,希望有人可以直接看我的电脑会更好。感谢您的所有帮助 - 我敢肯定,即使它们不是主要问题,我所有的语法错误也会在以后造成麻烦。 为什么这被否决了?如果您因为觉得这是错误的而要对此投反对票,那么也对其他人投反对票。解释反对意见。【参考方案3】:根据 MySQL 文档:
SHA2(str, hash_length)
计算 SHA-2 系列哈希函数(SHA-224、SHA-256、SHA-384 和 SHA-512)。第一个参数是要散列的明文字符串。第二个参数表示结果所需的位长度,其值必须为 224、256、384、512 或 0(相当于 256)。如果任一参数为 NULL 或哈希长度不是允许值之一,则返回值为 NULL。否则,函数结果是包含所需位数的哈希值。请参阅本节开头关于高效存储哈希值的说明
您需要为SHA2()
函数提供第二个参数(哈希长度),此参数必须是值 224、256、384、512 或 0 之一。
INSERT INTO `user` (`username`, `salt`, `passwordhash`) VALUES ('username', 'a1b2c3d4e5f6g', SHA2(CONCAT('password', 'a1b2c3d4e5f6g'),256));
【讨论】:
Didn't I already say that? “是的,你做到了,那又怎样?” 你为什么要这么流氓? OP告诉我这没有什么不同。我希望这能让你回过神来,如果你想恢复态度的话。 哇,保持冷静,伙计,我不是故意要伤害你的……事实上,这是他查询的唯一问题…… 感谢您的帮助。看起来问题确实出在 CONCAT 之类的东西上。它说 Unrecognized Keyword 及其下游的所有内容都是错误的。它还说明了第 99 位的右括号? (请参阅屏幕截图)。我已经尝试了该线程中所有建议的所有语法组合,但没有任何效果:/ 如果我伤害了你,我很抱歉,请原谅。只是我没明白你说的“我不是已经说过了吗?”是什么意思。 @Fred-ii-以上是关于MySQL PhpMyAdmin - 无法识别的关键字 CONCAT的主要内容,如果未能解决你的问题,请参考以下文章