【问题标题】:mysql_skip_secure_auth not skipping secure authmysql跳过secureauth不跳过secureauth
【发布时间】:2014-05-07 07:23:12
【问题描述】:

编辑:据我所知,这个问题的根本原因是安装了正确的 Perl 模块,但加载了错误的 mysql.so 文件。

my $dsn = "DBI:mysql:"
    . "database=$db;"
    . "host=$dbhost;"
    . "mysql_ssl=$dbssl;"
    . "mysql_skip_secure_auth=1;";

我最近尝试升级我们的 DBD::mysql 版本,但不断遇到DBI connect('database=mydb;host=myhost','myuser',...) failed: Connection using old (pre-4.1.1) 错误。

经过数小时的调试,并确定正确选项不更新我们的 mysql 表的密码散列方法在我们的整个系统中是不可能的,我发现使用DBD::Mysql 4.027 你可以将“mysql_skip_secure_auth”声明为 dsn 的一部分。

但是,这似乎不起作用。

如果我运行mysql -h $myhost -u $myuser -p --skip-secure-auth,我可以毫无意外地连接,但是尝试使用 DBI/DBD::mysql 执行此操作时,我总是遇到上述错误,好像该指令被忽略了一样。

我也尝试过使用具有相同选项集的mysql_read_default_file,以及在DSN 中简单地使用mysql_skip_secure_auth。这些东西的任何组合都没有奏效。

我错过了什么吗?

编辑:

跟踪输出(经过编辑以删除敏感信息):

imp_dbh->mysql_dr_connect: host = |{host}|, port = 0, uid = {user}, pwd = {pwd}
imp_dbh->mysql_dr_connect: Skipping secure auth
imp_dbh->bind_type_guessing: 0
imp_dbh->use_server_side_prepare: 0
imp_dbh->mysql_dr_connect: client_flags = 2
imp_dbh->mysql_dr_connect: <-           --> do_error
Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) error 2049 recorded: Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)




my $versions = DBI->installed_versions;
foreach (keys %$versions) {
    print "\n$_: " . %$versions->{$_};
}

DBD::SQLite: 1.26                                                               
DBD::ExampleP: 12.014310                                                          
DBD::Sponge: 12.010002                                                             
DBD::Gofer: 0.015057                                                             
DBD::DBM: 0.06                                                                    
DBD::mysql: 4.027                                                                  
DBI: 1.618

【问题讨论】:

  • 了解 4.1 之前的密码是 officially deprecated,并且在未来的版本中将删除对它们的支持。在某些时候,您将不得不升级到新的密码散列。对于您的直接问题,请在您的 connect 语句之前打开 DBI 的 tracing 以查看幕后发生的情况:DBI-&gt;trace('3|CON'); 我在跟踪输出中看到了这一点:imp_dbh-&gt;mysql_dr_connect: Skipping secure auth
  • perl -MDBD::mysql -e 'print $DBD::mysql::VERSION' 将显示您的 Perl 正在使用的 DBD::mysql 的版本。我猜你实际上并没有使用 4.027,因为当我使用 4.027 运行时,我在跟踪中的 imp_dbh-&gt;mysql_dr_connect: host = ... 之后立即得到 imp_dbh-&gt;mysql_dr_connect: Skipping secure auth;使用 4.013,没有这样的消息。
  • 也许将print $DBD::mysql::VERSION 添加到您遇到问题的脚本的顶部,以确保。我非常怀疑这会影响它,但可能会仔细检查 DBI 是否也是最新的。
  • 你是对的,对不起。而不是在use DBI; 之后打印调用DBI-&gt;installed_versions; 来显示所有已安装驱动程序的版本。我会拿出use DBD::mysql;
  • 我也很难过。不确定更新 DBI 是否会修复它,但值得一试。仅供参考,您的 Perl 和 MySQL 版本是什么?

标签: perl perl-module dbi


【解决方案1】:

你说得对,这方面的事情有点棘手,但挑战似乎源于 C mysql lib 而不是 DBD::mysql。

首先,将参数作为驱动程序选项而不是作为主 DSN 字符串的一部分传递: my @dsn = ("DBI:mysql:database=$db;host=$dbhost;mysql_ssl=$dbssl", $user, $pissword, { mysql_skip_secure_auth => 1 });

只要您不使用 .cnf 文件,这应该可以工作。

通过文件进行身份验证有一些限制。 my @dsn = ("DBI:mysql:"database=$db;host=$dbhost;mysql_ssl=$dbssl;" . "mysql_read_default_file=$absolute_path.cnf", undef, undef, { mysql_skip_secure_auth => 1 });

确保您的文件不包含 secure_auth 的条目,否则 C 库会错误地将其视为已启用,即使该条目已禁用它。

任何与此类似的行,具有禁用(虚假)值 secure_auth = FALSE 必须改为 skip_secure_auth (并确认 mysql 和 mysqldump 等标准工具可以像以前一样工作)。

C 库有一个错误,它将secure_auth = FALSE 视为secure_auth = TRUE,我认为它还有第二个错误,它忽略了skip_secure_auth 而不是尊重它。

根据http://dev.mysql.com/doc/refman/5.6/en/mysql-options.htmlsecure_auth 的文档,通常不支持选项,但奇怪的是,一种形式(错误)实现而另一种形式被忽略。

如果您的代码知道它正在连接到 v4.0 服务器,则上述“有效”,但我宁愿不要将代码与特定于服务器的逻辑混为一谈。我仍然希望有一种方法可以修补 C 库,这样就可以像标准工具一样纯粹通过 .cnf 文件来完成。

作为附录,如果由于某种原因您不能使用 skip_secure_auth,则需要从您的 [client] 部分中省略所有 secure_auth 条目,而是将 secure_auth = FALSE 添加到您的工具所需的每个部分,即 [mysql][mysqldump] 等,这显然很可怕。

【讨论】:

  • 在Mac上哪里可以找到C API,我已经搜索了很长时间,但似乎可以找到它......
  • 那么在默认开启的客户端库上是否无法禁用安全身份验证?
【解决方案2】:

对于我的 Mysql 5.0,这原来是 old_passwords 的问题。我将secure_auth = ON更改为疑难解答,并出现以下错误:

失败:服务器在 --secure-auth 模式下运行,但 'user'@'hostname' 有旧格式的密码;请把密码改成新格式

mysql 服务器已将密码存储在 16 字符哈希中。更新到 41 char 哈希后,我能够连接。不需要 mysql_skip_secure_auth 条目。还将服务器返回到secure_auth = OFF

我还能够将服务器保持为 old_passwords=1

密码升级说明 http://code.openark.org/blog/mysql/upgrading-passwords-from-old_passwords-to-new-passwords

【讨论】:

    猜你喜欢
    • 2020-09-23
    • 2012-11-27
    • 2020-03-21
    • 2021-03-14
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    相关资源
    最近更新 更多