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

perl – mysql_skip_secure_auth不跳过安全身份验证,第1张

概述编辑:据我所知,这个问题的根本原因是正在安装正确的Perl模块,但是正在加载错误的 mysql.so文件. my $dsn = "DBI:mysql:" . "database=$db;" . "host=$dbhost;" . "mysql_ssl=$dbssl;" . "mysql_skip_secure_auth=1;"; 我最近尝试升级我们的DBD :: m 编辑:据我所知,这个问题的根本原因是正在安装正确的Perl模块,但是正在加载错误的 mysql.so文件.

my $dsn = "DBI:MysqL:"    . "database=$db;"    . "host=$dbhost;"    . "MysqL_ssl=$dbssl;"    . "MysqL_skip_secure_auth=1;";

我最近尝试升级我们的DBD :: MysqL版本,但不断遇到DBI连接(‘database = mydb; host = myhost’,’myuser’,…)失败:连接使用旧版(4.1.1之前版) )错误.

几个小时的调试后,并确定没有更新我们的MysqL表的密码哈希方法的正确的选项是不可能与我们的整个系统,我发现有@L_301_1@你可以声明“MysqL_skip_secure_auth”作为DSN的一部分.

但是,这似乎不起作用.

如果我runMysqL -h $为myhost -u $myuser的-p –skip-安全-auth的,我能够平安无事连接,而是试图用DBI / DBD为此:: MysqL的,我总是碰到上述错误,好像该指令被忽略了.

> Relevant documentation

我也尝试使用具有相同选项集的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 authimp_dbh->bind_type_guessing: 0imp_dbh->use_server_sIDe_prepare: 0imp_dbh->MysqL_dr_connect: clIEnt_flags = 2imp_dbh->MysqL_dr_connect: <-           --> do_errorConnection 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 lib而不是DBD :: MysqL.

首先,将param作为驱动程序选项而不是作为主DSN字符串的一部分传递:

    我的@dsn =(“DBI:MysqL:database = $db; host = $dbhost; MysqL_ssl = $dbssl”,
    $用户,
    $pissword,
    {MysqL_skip_secure_auth => 1});

只要您没有使用.cnf文件,这应该可以正常工作.

要通过文件进行身份验证,存在一些限制.

    我的@dsn =(“DBI:MysqL:”database = $db; host = $dbhost; MysqL_ssl = $dbssl;“
    . “MysqL_READ_DEFAulT_file = $absolute_path.cnf”
    民主基金,
    民主基金,
    {MysqL_skip_secure_auth => 1});

确保您的文件不包含secure_auth的条目,否则C lib会错误地将其视为已启用,即使该条目已禁用该条目也是如此.

任何类似于此的行,具有禁用(假)值

    secure_auth = FALSE

必须改为

    skip_secure_auth

(并确认标准工具,如MysqL和MysqLdump像以前一样工作).

C lib有一个错误,它将secure_auth = FALSE视为secure_auth = TRUE,在我看来它有第二个错误,因为它忽略了skip_secure_auth而不是尊重它.

根据http://dev.mysql.com/doc/refman/5.6/en/mysql-options.html的文档,一般不支持secure_auth选项,但奇怪的是,一个表单是(mis)实现的,而另一个表单被忽略.

如果您的代码知道它连接到v4.0服务器,上面的“工作”,但我宁愿不用服务器特定的逻辑来破坏代码.我仍然希望有一种方法可以修补C库,所以这可以完全通过.cnf文件来完成,就像标准工具一样.

作为附录,如果有一些原因你不能使用skip_secure_auth,则需要省略[clIEnt]部分中的所有secure_auth条目,而是将secure_auth = FALSE添加到工具所需的每个部分,即[MysqL],[MysqLdump],等等,这显然是可怕的.

总结

以上是内存溢出为你收集整理的perl – mysql_skip_secure_auth不跳过安全身份验证全部内容,希望文章能够帮你解决perl – mysql_skip_secure_auth不跳过安全身份验证所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236399.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存