【问题标题】:PHP truncating hashed password on retrieval from databasePHP在从数据库检索时截断散列密码
【发布时间】:2013-04-23 07:48:32
【问题描述】:

我目前在让登录系统正常工作时遇到了一些问题,我相信我已经找到了原因,但我不知道为什么会发生这种情况或具体是什么原因造成的。

我有一个存储在数据库中的散列密码。 password 列的值为:

18e2acd33fd3ec752c344b463d00238e35b6b77ed65941f69b9eb96471834f1e507d846071768548f8cf125d6c74ce614d477a576657983bb8620bbc49eed7de

现在,当我像这样在 PHP 中选择并打印该字段时:

$query = "SELECT password FROM webusers WHERE username = 'Roy'";
$update = odbc_exec($connect, $query);
$row = odbc_fetch_array($update);
print $row['PASSWORD'];

它输出:

18e2acd33fd3ec752c344b463d00238e35b6b77ed65941f69b9eb96471834f1e507d846071768548f8cf125d6c74ce614d477a576657983bb8620bbc49eed7d

滚动到两个散列的最后,您会看到第二个散列缺少最后一个“e”,所以这会影响我的整个登录系统。为什么会发生这种情况?我不确定是 PHP 还是 SQL 应该受到责备。

我使用的是 PHP 5.4.7,数据库是通过 ODBC 连接的 4D SQL 服务器。

编辑:password 的数据类型是Text,根据 4D 的手册,它最多可以容纳 2GB 的数据,因此列大小不是问题。

【问题讨论】:

  • 你的数据库中password字段的数据类型是什么?当您直接在数据库中查看密码字段时(通过 PHPMyAdmin 或其他一些工具),您看到最后一个 e 了吗?
  • 如果小于 128 个字符,哈希是否会被截断?例如,“fd3ec752c344b463d00238e35”会被截断为“fd3ec752c344b463d00238e3”吗?
  • @FreemanLambda 它实际上有 128, 0-127,截断的字符串是 127, 0-126 所以如果有某种内存限制会很奇怪。
  • @Roy 你能用一个非常简单的查询来测试拉一个更大的字符串吗?也许只是设置另一个表,向其中添加大量文本并尝试从 PHP 获取/回显它。我现在只能猜测,您的数据库以某种方式对它可以返回的数据大小设置了某种上限。
  • 您可以访问您的PHP.ini 文件吗?如果是这样,是否有 odbc.defaultlrl 值?如果是这样,那是什么?如果没有,请尝试将其添加为odbc.defaultlrl=65536

标签: php sql odbc 4d-database


【解决方案1】:

要确定您的问题是在 MySQL 还是 PHP 中,请直接登录 MySQL 并确定您是否能够在直接执行 SQL 命令时检索完整值。我将使用与 PHP 相同的 SQL 查询,以便您从 MySQL 系统中看到与您的应用程序看到的相同的输出。如果您在 MySQL 中看到一个截断的值(PHP 不再是图片的一部分),那么您肯定知道您已经超出了您在 MySQL 中定义的字段的字符限制。同样,如果字符串显示完美,则 PHP 必须截断该值。

如果 PHP 正在截断该值,则可能是 mysql_result 对象的限制,也可能是 PHP 的系统限制,这似乎不太可能。通过进一步缩小问题的位置,您的答案将变得清晰。

我从未见过 PHP 截断字符串。在为电子邮件制作附件标题时,我在单个字符串值中存储了至少一兆字节的数据。我不相信你的限制在于 PHP 原生语言。

【讨论】:

  • 我用的不是MySQL,而是4D的SQL实现。该字段在数据库本身内很好。从那以后,我使用了一种不同的方法来解决这个问题,但看起来故障在于我正在使用的过时的 ODBC 驱动程序。我宁愿不使用它,但不幸的是,我必须在现有系统上进行构建,该系统目前已有 15 年的历史并且没有太多选择。无论如何感谢您的回复!
猜你喜欢
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多