【问题标题】:Insert fails in phpMyAdmin, but works when using MySQL directly在 phpMyAdmin 中插入失败,但在直接使用 MySQL 时有效
【发布时间】:2020-06-12 14:48:02
【问题描述】:

我正在尝试将哈希插入 MySQL,以便测试用户登录。我的第一直觉是使用 phpMyAdmin 来更轻松地快速更新密码(默认哈希为 60 0),直到我开始使用我的网站制作一个页面。哈希字段是 binary (60) 数据类型。我的错误是请输入有效的十六进制输入

要生成哈希,我使用以下代码:Code Credit

$pass = "password";
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$cost = 10;
$salt = sprintf("$2y$%02d$", $cost) . $salt;
$hash = crypt($pass, $salt);
echo $hash;//Result: $2y$10$XFo5biY5UvZfaRjhDraOFO26yocvwiAwidtGNIvoEezj5zitb2Xem

我已经意识到我已经完成了让网站为我做插入的工作,但这不是问题所在。我想知道为什么 phpMyAdmin > myDB > myTable > browse > edit 然后从上面复制粘贴结果 不起作用,但是 phpMyAdmin > myDB > myTable > SQL 在使用以下内容时确实有效:

UPDATE `myTable` SET `hash`="$2y$10$XFo5biY5UvZfaRjhDraOFO26yocvwiAwidtGNIvoEezj5zitb2Xem" WHERE username = "myusername"

回到 phpMyAdmin > myDB > myTable > browse 我发现我的 ASCII 哈希已更改为 HEX 哈希:

2432792431302458466f356269593555765a6661526a684472614f464f3236796f637677694177696474474e49766f45657a6a357a6974623258656d

当我在 phpMyAdmin 中进行选择时,这个 HEX 字符串保持不变,但是,使用 MySQL 控制台,我从来没有看到 HEX,它总是 ASCII。有谁知道为什么我不能在 phpMyAdmin 中插入 ASCII 哈希,但我可以在 MySQL 中?

编辑:死链接,但WayBack Machine 有一个副本。

【问题讨论】:

    标签: php mysql hash


    【解决方案1】:

    我知道这个问题已经有四年了,我的回答并没有解决问题,但它解释了正在发生的事情。所以为了后续搜索者的利益:

    您描述的行为是由 phpmyadmin UI 引起的。更新/插入是 ajax 调用,验证在浏览器中使用 javascript 进行。验证查看您正在更新/插入的字段的类型,并只允许您认为是有效内容。 我认为您的哈希字段是 VARBINARY。当我知道只有非语言的 8 位字符串(如 UUID)将被输入时,我使用该类型为服务器节省资源以确定字符串的代码集,它对 VARCHAR 执行此操作。 现在 phpmyadmin/js/makegrid.js 在第 1403-1410 行做

    ...
    } else if ($this_field.hasClass('hex')) {
    if ($(g.cEdit).find('.edit_box').val().match(/^[a-f0-9]*$/i) !== null) {
    this_field_params[field_name] = $(g.cEdit).find('.edit_box').val();
    } else {
    var hexError = '<div class="error">' + PMA_messages.strEnterValidHex + '</div>';
    PMA_ajaxShowMessage(hexError, false);
    this_field_params[field_name] = PMA_getCellValue(g.currentEditCell);
    }
    ...
    

    这可能是你的问题,就像是我的一样。 不幸的是,除了更改源代码之外,我没有看到禁用此功能的方法,这不是一个好主意,因为它将被下一个版本更新覆盖。

    【讨论】:

    • 如果我记得的话,我使用的是“BINARY (60)”,而不是 VARBINARY。我有时会很迂腐,所以如果我在上面写到我使用的是 BINARY (60),那很可能就是我使用的。如果有人好奇,我写了一个小小提琴来展示 gsl 有用地指出的内容。 jsfiddle.net/n68jyw14
    • 多么真实的 TeckFudge。我错过了那个细节。
    • 为了帮助其他人学习如何解决上述问题,或者只是出于我自己的好奇心,您是如何找到导致我问题的违规代码的?我想你也有类似的问题,经过研究,找到了我的帖子。
    • 我和你的处境完全一样,本可以自己发布问题。实际上我已经形成了我的假设,并希望可以通过 ini 文件中的设置来禁用它。由于您的问题没有得到解答,并且我在其他地方找不到任何相关信息,因此作为一个习惯使用 phpMyAdmin 的懒人,我开始在 phpMyAdmin 代码中查看显示的错误消息,找到它,这导致我找到“strEnterValidHex”和上面发布的 js 解释了原因并建议它不能被设置覆盖。
    【解决方案2】:

    我还找到了一个懒惰的解决方法

    如果您双击编辑 BINARY 字段,您可以输入任何有效的字符串,例如“a”。这将被接受并更新表格。 phpMyAdmin 还将在框架顶部输出 sql 查询 (UPDATE table set field = 'a'),并在右侧提供 [Edit inline] 按钮。 然后只需将 HEX 字符串粘贴到查询中即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2012-11-06
      • 2019-11-03
      • 1970-01-01
      相关资源
      最近更新 更多