php mysqli_connect: วิธีการตรวจสอบสิทธิ์ที่ไคลเอ็นต์ไม่รู้จัก [caching_sha2_password]


102

ฉันใช้ php mysqli_connectเพื่อเข้าสู่ฐานข้อมูล MySQL (ทั้งหมดบน localhost)

<?php
//DEFINE ('DB_USER', 'user2');
//DEFINE ('DB_PASSWORD', 'pass2');
DEFINE ('DB_USER', 'user1');
DEFINE ('DB_PASSWORD', 'pass1');
DEFINE ('DB_HOST', '127.0.0.1');
DEFINE ('DB_NAME', 'dbname');

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if(!$dbc){
    die('error connecting to database');    
}
?>

นี่คือตาราง mysql.user: mysql.user ตาราง

MySQL Server ini ไฟล์:

[mysqld]
# The default authentication plugin to be used when connecting to the server
default_authentication_plugin=caching_sha2_password
#default_authentication_plugin=mysql_native_password

ที่มีcaching_sha2_passwordอยู่ในแฟ้ม INI เซิร์ฟเวอร์ MySQL มันเป็นไปไม่ได้ที่ทุกคนเข้าสู่ระบบด้วย user1 หรือ user2;

ข้อผิดพลาด: mysqli_connect (): เซิร์ฟเวอร์ร้องขอวิธีการตรวจสอบสิทธิ์ที่ไม่รู้จักกับไคลเอนต์ [caching_sha2_password] ใน ...

ที่มีmysql_native_passwordอยู่ในแฟ้ม INI เซิร์ฟเวอร์ MySQL ก็เป็นไปได้ที่จะเข้าสู่ระบบด้วย user1 แต่มี user2 ข้อผิดพลาดเดียวกัน


ฉันจะเข้าสู่ระบบโดยใช้caching_sha2_passwordเซิร์ฟเวอร์ mySql ได้อย่างไร?


PDO รองรับสิ่งนี้หรือไม่ ฉันเคยเห็นรายงานอื่น ๆ เกี่ยวกับmysqli.
tadman

คำตอบที่โพสต์โดย @ 黃皓哲ควรทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับ
FIL

คำตอบ:


56

สำหรับ PHP 7.4 นี่ไม่ใช่ปัญหาอีกต่อไป เพิ่มการรองรับcaching_sha2วิธีการตรวจสอบสิทธิ์ใน mysqlnd แล้ว


ปัจจุบันส่วนขยาย PHP mysqli ไม่รองรับคุณลักษณะการตรวจสอบความถูกต้อง caching_sha2 ใหม่ คุณต้องรอจนกว่าพวกเขาจะปล่อยการอัปเดต

ตรวจสอบโพสต์ที่เกี่ยวข้องจากนักพัฒนา MySQL: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

พวกเขาไม่ได้พูดถึง PDO บางทีคุณควรพยายามเชื่อมต่อกับ PDO



@Machavity รู้ไหมว่าคำตอบนี้ยังใช้ได้? ได้แก่ . ยังไม่ล้าสมัยกับ PHP เวอร์ชันใหม่ ๆ ?
เจน

@gen จากข้อผิดพลาดนี้ดูเหมือนว่าจะทำงานได้ถึง 7.4.2
Machavity

3
การอัปเกรดเป็น php7.4 จะช่วยแก้ปัญหานี้ได้ และฉันคิดว่านั่นเป็นแนวทางที่ดีที่สุดแทนที่จะเปลี่ยนวิธีการพิสูจน์ตัวตนmysql_native_passwordเป็นตามคำตอบบางคำ
ultrasamad

ฉันใช้นักเทียบท่า (apache + php ในคอนเทนเนอร์และ mysql ในคอนเทนเนอร์อื่น) และสิ่งนี้ช่วยแก้ปัญหาของฉันได้ ขอบคุณ!
Joan Galmés Riera

236

ฉันแก้ปัญหานี้ด้วยคำสั่ง SQL:

ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

ซึ่งอ้างอิงโดยhttps://dev.mysql.com/doc/refman/8.0/en/alter-user.html

หากคุณกำลังสร้างผู้ใช้ใหม่

 CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

ซึ่งอ้างอิงโดยhttps://dev.mysql.com/doc/refman/8.0/en/create-user.html

สิ่งนี้ใช้ได้กับฉัน


3
คำตอบที่ดี. gotcha นี่คือคุณอาจต้องทำสิ่งนี้ทุกครั้งที่คุณเพิ่มผู้ใช้ใหม่ขึ้นอยู่กับการตั้งค่าเซิร์ฟเวอร์
Machavity

3
ขอบคุณมากฉันกำลังมองหาวิธีแปลงแฮชรหัสผ่านใหม่เป็นแบบเก่า (เช่นรูปแบบผู้ใช้ 2 เป็นรูปแบบผู้ใช้ 1 ในคำถาม) และคำตอบของคุณก็ตรงตามความต้องการ
นักบัญชี

10
และจบลงด้วยการต่อสู้ 4 วันเพื่อให้ php-7.2.9 / 11 เล่นได้ดีกับ MySQL-8.012 ใครบางคนในทีม PHP สามารถมั่นใจในการจดบันทึกสิ่งนี้ในการติดตั้งใน tarball ได้หรือไม่? จะช่วยประหยัดเวลาคนได้หลายพันชั่วโมงในปีหรือสองปีถัดไป
MountainMan

4
@MountainMan ช่วยชีวิตฉัน
Chase

8
นี่ควรเป็นคำตอบที่ยอมรับสำหรับวิธีแก้ปัญหา
Yohanes AI

29
ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

ลบเครื่องหมายคำพูด (') หลังALTER USERและใช้เครื่องหมายคำพูด (') หลังmysql_native_password BY

มันทำงานให้ฉันด้วย


2
นั่นเป็นทางออกเดียวที่ใช้ได้กับฉันบนเซิร์ฟเวอร์ localhost ที่ใช้เซิร์ฟเวอร์ WAMP :)
Jodyshop

สิ่งนี้ดูเหมือนจะแก้ไขได้ในการตั้งค่า Homebrew LAMP ของ Mac ของฉัน ไม่พบปัญหานี้บนเดเบียนแม้ว่า
Magnus

23

หากคุณใช้ Windows และไม่สามารถใช้งานcaching_sha2_passwordได้เลยคุณสามารถดำเนินการดังต่อไปนี้:

  1. เรียกใช้โปรแกรมติดตั้ง MySQL อีกครั้ง
  2. เลือก "กำหนดค่าใหม่" ถัดจาก MySQL Server (รายการบนสุด)
  3. คลิก "ถัดไป" จนกว่าคุณจะไปที่ "Authentication Method"
  4. เปลี่ยน "Use Strong Password Encryption for Authentication (RECOMMENDED)" เป็น "Use Legacy Authentication Method (Retain MySQL 5.X Compatibility)
  5. คลิก "ถัดไป"
  6. ป้อนรหัสผ่านบัญชีรูทของคุณในบัญชีและบทบาทและคลิก "ตรวจสอบ"
  7. คลิก "ถัดไป"
  8. คลิก "ถัดไป" ต่อไปจนกว่าจะถึง "ใช้การกำหนดค่า"
  9. คลิก "ดำเนินการ"

โปรแกรมติดตั้งจะทำการเปลี่ยนแปลงการกำหนดค่าทั้งหมดที่จำเป็นสำหรับคุณ


หลังจากหนึ่งปีของการโหวตคำตอบนี้ฐานข้อมูลของฉันถูกแฮ็ก ...
ต้นไม้รหัส

12

มันใช้งานได้สำหรับฉัน (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64bits)

แก้ไขไฟล์C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

รีเซ็ตบริการ MySQL บน Windows และใน MySQL Shell ...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

มันใช้งานได้ขอบคุณ ... เราต้องกำหนดค่า 2 อย่างคือ mysql conf และ alter user
danisupr4

10

เช่นเดียวกับหลาย ๆ คนฉันเคยมีปัญหาเดียวกัน แม้ว่าผู้ใช้จะถูกตั้งค่าให้ใช้ mysql_native_password และฉันสามารถเชื่อมต่อจากบรรทัดคำสั่งได้วิธีเดียวที่ฉันจะได้รับ mysqli () เพื่อเชื่อมต่อคือการเพิ่ม

default-authentication-plugin = mysql_native_password

ไปที่ส่วน [mysqld] ของในการตั้งค่าของฉันบน ubuntu 19.10, /etc/mysql/mysql.conf.d/mysqld.cnf


2
นอกจากนี้โปรดทราบว่าหากผู้ใช้ถูกสร้างขึ้นก่อนการเปลี่ยนแปลงนี้จะใช้ไม่ได้ ดังนั้นคุณควรตั้งค่าเริ่มต้นการรับรองความถูกต้องในการกำหนดค่าและสร้างผู้ใช้เพื่อให้ทำงานได้!
Oleg Popov

4

ฉันรันคำสั่งต่อไปนี้ ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';ในบรรทัดคำสั่งและในที่สุดก็รีสตาร์ท MySQL ในบริการท้องถิ่น


ไม่'root' @ 'localhost'ควรอ่านเว้นวรรคตรงนี้แทนALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
d1jhoni1b

4

ตอนนี้คุณสามารถอัปเกรดเป็น PHP7.4 แล้ว MySQL จะใช้งานได้caching_sha2_passwordตามค่าเริ่มต้นดังนั้นการติดตั้ง MySQL เริ่มต้นจะทำงานโดยmysqli_connectไม่ต้องกำหนดค่า


2
ไม่มาก เป็นบั๊กกี้ใน 7.4.0 และ 7.4.1 แก้ไขใน 7.4.2
Machavity

3

หากคุณใช้ Mac นี่คือวิธีแก้ไข นี่คือหลังจากการลองผิดลองถูกมากมาย หวังว่านี่จะช่วยคนอื่น ..

การแก้จุดบกพร่อง:

$mysql --verbose --help | grep my.cnf

$ which mysql
/usr/local/bin/mysql

ความละเอียด: nano /usr/local/etc/my.cnf

เพิ่ม: default-authentication-plugin = mysql_native_password

-------
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
default-authentication-plugin=mysql_native_password
------

ในที่สุด Run: brew services รีสตาร์ท mysql


ต้องการสิ่งนี้ ... ขอบคุณ!
nykc

1

ฉันลองสิ่งนี้ใน Ubuntu 18.04 และเป็นทางออกเดียวที่เหมาะกับฉัน:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

-4

ฉันคิดว่าการกำหนดค่าเซิร์ฟเวอร์ mysql ไม่มีประโยชน์หากไม่มีการเข้ารหัส caching_sha2_password เราต้องหาวิธีเผยแพร่ส่งหรือรับข้อมูลที่ปลอดภัยผ่านเครือข่าย ดังที่คุณเห็นในโค้ดด้านล่างฉันไม่ได้ใช้ตัวแปร $ db_name และฉันใช้ผู้ใช้ในเซิร์ฟเวอร์ mysql ด้วยรหัสผ่านการกำหนดค่ามาตรฐาน เพียงสร้างรหัสผ่านผู้ใช้มาตรฐานและกำหนดค่าสิทธิพิเศษทั้งหมด มันใช้งานได้ แต่ฉันพูดอย่างไรโดยไม่แยกส่วน

<?php
$db_name="db";
$mysql_username="root";
$mysql_password="****";
$server_name="localhost";
$conn=mysqli_connect($server_name,$mysql_username,$mysql_password);

if ($conn) {
    echo "connetion success";
}
else{
    echo mysqli_error($conn);
}

?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.