복붙노트

이전 인증을 사용하는 MySQL 4.1 이상에 연결할 수 없습니다

PHP

이전 인증을 사용하는 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 (새로운 mysqli (...))와 연결하고있다. 나는 코드에서 bluesql.net의 DB에 연결하기 위해 뭔가를 할 수 있기를 바라고있다. 분명히 데이터베이스 설정 방법을 제어하지 않는다. 다운 그레이드 PHP 버전은 옵션이 아닙니다.

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

해결법

  1. ==============================

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

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

    먼저 SQL 쿼리를 확인하십시오.

    SHOW VARIABLES LIKE 'old_passwords'
    

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

    mysql.user 테이블 (그 테이블에 접근 할 수있는 계정을 가지고 있음)을 살펴봄으로써 어느 루틴이 사용될 것인지를 확인할 수있다.

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

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

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

    (사용자 및 호스트를 이전 쿼리에서 가져온 값으로 대체하십시오.) 그런 다음 암호의 길이를 다시 확인하십시오. 현재 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

  2. ==============================

    2.방금이 문제가 있었고 해결할 수있었습니다.

    방금이 문제가 있었고 해결할 수있었습니다.

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

    다음 쿼리를 실행하십시오.

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

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

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

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

    편집 : Garland Pope의 의견에 따라 PHP 5.4에서 PHP 코드에서 CLIENT_LONG_PASSWORD를 수동으로 설정할 필요가 없을 수도 있습니다!

    편집 : 안토니오 Bonifati, 당신을 위해 쿼리를 실행하는 PHP 스크립트의 호의 :

    <?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"; 
    ?>
    
  3. ==============================

    3.당신은 당신의 mysql 쿼리 브라우저 또는이 라인을 할 수있다.

    당신은 당신의 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;
    

    note : 사용자 이름과 비밀번호

    그 후에 그것은 일할 수 있어야합니다. 나는 방금 내 문제를 해결했다.

  4. ==============================

    4.OSX에서는 사이트 맵 데이터베이스에 연결할 때 동일한 문제를 해결하기 위해 MacPorts를 사용했습니다. Siteground에서 5.0.77mm0.1-log를 사용하고있는 것 같지만 새 사용자 계정을 만들지 않아도 문제가 해결됩니다. 이것은 무엇을 했는가?

    OSX에서는 사이트 맵 데이터베이스에 연결할 때 동일한 문제를 해결하기 위해 MacPorts를 사용했습니다. Siteground에서 5.0.77mm0.1-log를 사용하고있는 것 같지만 새 사용자 계정을 만들지 않아도 문제가 해결됩니다. 이것은 무엇을 했는가?

    sudo port install php5-mysql -mysqlnd +mysql5
    

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

  5. ==============================

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

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

  6. ==============================

    6.MySQL 서버 설정에 대한 관리자 권한이 없다면 (즉, 호스팅 서비스를 사용하고있는 경우), 다음 두 가지 옵션을 사용할 수 있습니다.

    MySQL 서버 설정에 대한 관리자 권한이 없다면 (즉, 호스팅 서비스를 사용하고있는 경우), 다음 두 가지 옵션을 사용할 수 있습니다.

    1) MySQL 서버에서 old_passwords 옵션을 false로 설정하도록 요청하십시오

    2) 옵션 1이 발생할 때까지 PHP를 5.2.2로 다운 그레이드하십시오.

    내가 찾은 것부터 MySQL 계정 암호가 저장되는 방식과 'old_passwords'설정이 true로 설정된 경우 문제가있는 것으로 보입니다. 이로 인해 MySQL과 새로운 버전의 PHP (5.3+) 사이의 호환성 문제가 발생합니다. PHP는 41 문자 해시를 사용하여 연결을 시도하지만 MySQL 서버는 여전히 16 자의 해시를 사용하여 계정 비밀번호를 저장합니다.

    이 비 호환성은 MySQL 4.1에서 사용 된 해싱 방법을 변경하여 짧고 긴 해시 길이를 허용합니다 (이 페이지의 시나리오 2 : http://dev.mysql.com/doc/refman/ 5.5 / ko / password-hashing.html) 및 PHP 5.3에 MySQL Native Driver 포함 (PHP 설명서에서이 페이지의 글 머리 기호 7에 설명 된 이전 버전과의 호환성 문제 : http://www.php.net/manual/en /migration53.incompatible.php).

  7. ==============================

    7.만약,

    만약,

    그때,

    xampp 1.7.0을 설치하는 것이 좋습니다. 다운로드 링크

    참고 : 위의 문제에 대한 해결책은 아니지만 개발을 계속할 수있는 FIX입니다.

  8. from https://stackoverflow.com/questions/1575807/cannot-connect-to-mysql-4-1-using-old-authentication by cc-by-sa and MIT license