gpt4 book ai didi

perl - mysql_skip_secure_auth 不跳过安全身份验证

转载 作者:行者123 更新时间:2023-12-02 02:04:38 29 4
gpt4 key购买 nike

编辑:据我所知,此问题的根本原因是安装了正确的 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 (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

最佳答案

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

首先,将参数作为驱动程序选项而不是作为主 DSN 字符串的一部分传递:
我的@dsn =(“DBI:mysql:数据库= $ db;主机= $ dbhost;mysql_ssl = $ dbssl”,
$用户,
$尿字,
{ mysql_skip_secure_auth => 1 });

只要您不使用 .cnf 文件,该方法就应该有效。

要通过文件进行身份验证有一些限制。
我的 @dsn = ("DBI:mysql:"数据库=$db;主机=$dbhost;mysql_ssl=$dbssl;"
。 “mysql_read_default_file=$absolute_path.cnf”,
未定义,
未定义,
{ mysql_skip_secure_auth => 1 });

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

任何与此类似的行,具有禁用(假)值
安全验证=假
必须改为
跳过安全验证
(并确认 mysql 和 mysqldump 等标准工具像以前一样工作)。

C 库有一个错误,它将 secure_auth = FALSE 视为 secure_auth = TRUE,在我看来,它还有第二个错误,因为它忽略了 Skip_secure_auth 而不是遵守它。

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

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

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

关于perl - mysql_skip_secure_auth 不跳过安全身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22702546/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com