developer tip

이전 인증을 사용하여 MySQL 4.1+에 연결할 수 없습니다.

copycodes 2020. 11. 7. 10:15
반응형

이전 인증을 사용하여 MySQL 4.1+에 연결할 수 없습니다.


http://bluesql.net 에서 mySQL 데이터베이스에 연결하려고하는데 연결하려고하면 다음 오류가 발생합니다.

Connect Error (2000) mysqlnd cannot connect to MySQL 4.1+ using old authentication

나는 이것을 조사했고, 그것은 MySQL 4.1 이전에 사용 된 오래된 암호 체계와 관련이 있습니다. 최신 버전에는 이전 암호를 사용할 수있는 옵션이 있으며, 이로 인해이 문제가 발생할 수 있습니다.

저는 php 5.3을 실행하고 있고 mySQLi (new mysqli (...))와 연결하고 있습니다. bluesql.net에서 DB에 연결하기 위해 코드에서 무언가를 할 수 있기를 바랍니다. 분명히 데이터베이스 설정 방법을 제어 할 수 없습니다. PHP 버전 다운 그레이드는 옵션이 아닙니다.

누구나 아이디어가 있습니까?


편집 : 이것은 MySQL 서버를 제어하는 ​​경우에만 적용됩니다 ... Mysql 암호 해싱 방법을 보지 않은 경우 이전 대 새

먼저 SQL 쿼리로 확인

SHOW VARIABLES LIKE 'old_passwords'

(MySQL 명령 줄 클라이언트, HeidiSQL 또는 원하는 프런트 엔드에서) 서버가 기본적으로 이전 암호 스키마를 사용하도록 설정되었는지 여부. 이 결과가 반환 old_passwords,Off되면 user테이블 에 이전 암호 항목이있는 것입니다. MySQL 서버는 이러한 계정에 대해 이전 인증 루틴을 사용합니다. 계정에 대한 새 암호를 설정하기 만하면 새 루틴이 사용됩니다.

mysql.user테이블 (해당 테이블에 대한 액세스 권한이있는 계정)을 살펴보면 어떤 루틴이 사용 될지 확인할 수 있습니다.

SELECT `User`, `Host`, Length(`Password`) FROM mysql.user

이렇게하면 이전 암호가있는 계정의 경우 16 이 반환 되고 새 암호가있는 계정의 경우 41 이 반환됩니다 (암호가없는 계정의 경우 0 도 반환 됩니다).
MySQL 프런트 엔드 (있는 경우)의 사용자 관리 도구를 사용하거나

SET PASSWORD FOR 'User'@'Host'=PASSWORD('yourpassword');
FLUSH Privileges;

( UserHost이전 쿼리에서 얻은 값으로 대체하십시오 .) 그런 다음 암호 길이를 다시 확인하십시오. 이제 41 이어야하며 클라이언트 (예 : mysqlnd)가 서버에 연결할 수 있어야합니다.

MySQL 문서도 참조하십시오 : * http://dev.mysql.com/doc/refman/5.0/en/old-client.html
* http://dev.mysql.com/doc/refman/5.0/en/password -hashing.html
* http://dev.mysql.com/doc/refman/5.0/en/set-password.html


서버를 제어 할 수 없는 경우

방금이 문제가 발생하여 해결할 수있었습니다.

먼저 old_passwords를 신경 쓰지 않는 이전 클라이언트로 MySQL 데이터베이스에 연결합니다. 스크립트에서 사용할 사용자를 사용하여 연결하십시오.

다음 쿼리를 실행합니다.

SET SESSION old_passwords=FALSE;
SET PASSWORD = PASSWORD('[your password]');

PHP 스크립트에서 클라이언트 플래그 1을 포함하도록 mysql_connect 함수를 변경합니다.

define('CLIENT_LONG_PASSWORD', 1);
mysql_connect('[your server]', '[your username]', '[your password]', false, CLIENT_LONG_PASSWORD);

이를 통해 성공적으로 연결할 수있었습니다.

편집 :화환 교황 의 의견, 그것은 PHP 5.4로 더 이상 당신의 PHP 코드를 수동으로 설정 CLIENT_LONG_PASSWORD 할 필요가 없습니다!

편집 : 사용자를 위해 쿼리를 실행하는 PHP 스크립트 Antonio Bonifati 제공 :

<?php const DB = [ 'host' => '...', # localhost may not work on some hosting 
    'user' => '...',
    'pwd' => '...', ]; 

if (!mysql_connect(DB['host'], DB['user'], DB['pwd'])) {
    die(mysql_error());
} if (!mysql_query($query = 'SET SESSION old_passwords=FALSE')) {
    die($query);
} if (!mysql_query($query = "SET PASSWORD = PASSWORD('" . DB['pwd'] . "')")) {
    die($query);
}

echo "Excellent, mysqli will now work"; 
?>

mysql 쿼리 브라우저에서이 줄을 할 수 있습니다.

SET old_passwords = 0;
UPDATE mysql.user SET Password = PASSWORD('testpass') WHERE User = 'testuser' limit 1;
SELECT LENGTH(Password) FROM mysql.user WHERE User = 'testuser';
FLUSH PRIVILEGES;

참고 : 사용자 이름 및 비밀번호

그 후에 작동 할 수 있어야합니다. 나도 방금 해결 했어


OSX에서는 MacPorts를 사용하여 사이트 그라운드 데이터베이스에 연결할 때 동일한 문제를 해결했습니다. Siteground는 5.0.77mm0.1-log를 사용하는 것으로 보이지만 새 사용자 계정을 만들어도 문제가 해결되지 않았습니다. 이게 무슨 짓이야

sudo port install php5-mysql -mysqlnd +mysql5

이것은 php가 사용할 mysql 드라이버를 다운 그레이드합니다.


같은 문제가 있었지만 쿼리 만 실행하면 도움이되지 않습니다. 이 문제를 해결하기 위해 다음을 수행했습니다.

  1. my.cnf 파일에서 old_passwords = 0 설정
  2. Restart mysql
  3. Login to mysql as root user
  4. Execute FLUSH PRIVILEGES;

If you do not have Administrator access to the MySQL Server configuration (i.e. you are using a hosting service), then there are 2 options to get this to work:

1) Request that the old_passwords option be set to false on the MySQL server

2) Downgrade PHP to 5.2.2 until option 1 occurs.

From what I've been able to find, the issue seems to be with how the MySQL account passwords are stored and if the 'old_passwords' setting is set to true. This causes a compatibility issue between MySQL and newer versions of PHP (5.3+) where PHP attempts to connect using a 41-character hash but the MySQL server is still storing account passwords using a 16-character hash.

This incompatibility was brought about by the changing of the hashing method used in MySQL 4.1 which allows for both short and long hash lengths (Scenario 2 on this page from the MySQL site: http://dev.mysql.com/doc/refman/5.5/en/password-hashing.html) and the inclusion of the MySQL Native Driver in PHP 5.3 (backwards compatibility issue documented on bullet 7 of this page from the PHP documentation: http://www.php.net/manual/en/migration53.incompatible.php).


IF,

  1. You are using a shared hosting, and don't have root access.
  2. you are getting the said error while connecting to a remote database ie: not localhost.
  3. and your using Xampp.
  4. and the code is running fine on live server, but the issue is only on your development machine running xampp.

Then,

It is highly recommended that you install xampp 1.7.0 . Download Link

Note: This is not a solution to the above problem, but a FIX which would allow you to continue with your development.

참고URL : https://stackoverflow.com/questions/1575807/cannot-connect-to-mysql-4-1-using-old-authentication

반응형