【发布时间】: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