PHP 5.4 PDO无法使用旧的不安全身份验证连接到MySQL 4.1+。

11

我知道有很多类似的问题,实际上我已经阅读了所有(9)个问题。

然而,它们中没有一个能解决我的问题。

我有一个共享主机套餐(最低配置)。我的套餐包括域名和一个单独的IP地址,MySQL服务器托管在这个地址上。为了开发,我正在使用PHP 5.4的开发服务器http://localhost/,并且我正在使用我在主机套餐中获得的MySQL服务器。

问题只出现在我的个人电脑上,因为我安装了PHP 5.4,但我的Web主机安装了PHP 5.2.17并且不会升级。MySQL服务器是MySQL 5.1.50版本的。

幸运的是,phpMyAdmin有一个内置的“更改密码”功能。

phpMyAdmin中有两个哈希选项可用于更改密码:

  • MySQL 4.1+
  • MySQL 4.0 兼容

我使用MySQL 4.1+选项更改了密码,并确认更新成功。

配置文件已更新。SET PASSWORD = PASSWORD( '***' )

然而,当我执行这个查询时:

SELECT @@global.old_passwords, @@session.old_passwords, Length(PASSWORD('abc'));

它告诉我密码长度仍为16。输出:

Tells me the password length is still 16. Output:

1     1     16

因此问题仍然存在。

无法连接到数据库。 SQLSTATE[HY000] [2000] mysqlnd无法使用旧的不安全身份验证方法连接MySQL 4.1+。 请使用管理工具通过命令SET PASSWORD = PASSWORD('your_existing_password')重置您的密码。 这将在mysql.user中存储新的更安全的哈希值。 如果该用户在PHP 5.2或更早版本执行的其他脚本中使用,则可能需要从my.cnf文件中删除old-passwords标志

我还尝试用phpMyAdmin中的DBO用户执行这些查询:

SET SESSION old_passwords=0; 
[phpMyAdmin reloads to the home screen, but the value remains = 1]

SET GLOBAL old_passwords = 0;
#1227 - Access denied; you need the SUPER privilege for this operation

FLUSH PRIVILEGES;
#1227 - Access denied; you need the RELOAD privilege for this operation

这与网络主机设置DBO用户菜单中所述的相矛盾:

数据库所有者
当您创建一个新的数据库时,需要指定一个数据库所有者(DBO)用户,该用户将具有对数据库的完全管理员访问权限。

这是我必须要向我的网络主机提出的问题吗?还是可以由我的DBO用户解决?否则,是否可以在PHP中绕过此问题?(因为它适用于PHP 5.2.17但不适用于PHP 5.4)


1
他们卡在 PHP 5.2.17 (2011-01-06) 和 MySQL 5.1.50 (2010-08-03) 上,不愿意升级?我会建议他们换一个新的主机。但是尽管如此,你应该始终使用与部署版本相同的本地开发和测试版本,以避免这种问题的发生。 - Bill Karwin
3个回答

32

已解决!

尽管在phpMyAdmin中使用SET SESSION old_passwords=0;无法生效。

我下载了MySQL GUI Tools并使用MySQL Query Browser在非DBO用户上执行了相同的命令:

SET SESSION old_passwords = 0;

SELECT @@global.old_passwords, @@session.old_passwords, Length(PASSWORD('abc'));

现在返回:

1      0      41

于是我只是简单地更改了密码:

SET PASSWORD = PASSWORD('my_old_password')

现在PHP 5.4 PDO使用该用户连接到数据库!


直到我在WorkBench中使用SET PASSWORD = PASSWORD('my_old_password')才使一切正常。 - Gabriel Patricio Bonilla
谢谢,伙计。我对共享主机服务感到很生气,因为它们使用旧系统并给我带来了很多麻烦... 我使用 SequelPro 连接到他们的服务器(这似乎是另一个安全问题,但接受来自任何地方的连接确实解决了我的问题)。 - qdev

3
phpMyAdmin中,设置会话变量是可行的,但密码函数的调用必须在同一个会话/执行中进行。
例如,如果我执行:
SET SESSION old_passwords = 0;
SET PASSWORD = PASSWORD('notagoodpassword');

它将正确地设置它。


非常感谢您:同时执行这两个查询对我比任何其他解决方案都更有效。 - Mohammed Samiullah

-1

这个解决方案可行: SET SESSION old_passwords = 0;

但是: 之后我不得不删除“旧”的userfrosting表并重新创建它 - 然后它就像魔法一样奏效了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接