perl – mysql_skip_secure_auth不跳过安全身份验证
编辑:据我所知,这个问题的根本原因是正在安装正确的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”, 只要您没有使用.cnf文件,这应该可以正常工作. 要通过文件进行身份验证,存在一些限制. ????我的@dsn =(“DBI:mysql:”database = $db; host = $dbhost; mysql_ssl = $dbssl;“ 确保您的文件不包含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],等等,这显然是可怕的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |