加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:15:37 所属栏目:大数据 来源:网络整理
导读:编辑:据我所知,这个问题的根本原因是正在安装正确的Perl模块,但是正在加载错误的 mysql.so文件. my $dsn = "DBI:mysql:" . "database=$db;" . "host=$dbhost;" . "mysql_ssl=$dbssl;" . "mysql_skip_secure_auth=1;"; 我最近尝试升级我们的DBD :: mysql版本
编辑:据我所知,这个问题的根本原因是正在安装正确的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表的密码哈希方法的正确的选项是不可能与我们的整个系统,我发现有DBD::Mysql 4.027你可以声明“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 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 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],等等,这显然是可怕的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读