Mysqli có hỗ trợ cho cacheing_sha2_password trong PHP 7.4 không?


8

Khi tôi thử nâng cấp từ PHP 7.3 lên PHP 7.4, tôi đã gặp lỗi này:

Phản hồi của máy chủ không mong đợi trong khi thực hiện cacheing_sha2 auth 109

Như tôi thấy, điều này chỉ ra rằng PHP 7.4 MySQLi đang cố gắng sử dụng caching_sha2_passwordplugin. Bài viết này chỉ ra rằng PHP MySQLi không hỗ trợ plugin (nó cũng gợi ý hỗ trợ trong tương lai cho nó), nhưng vì PHP 7.4 là mới và dường như đang cố gắng sử dụng nó, tôi đoán nó sẽ hoạt động. Ngoài ra, thông báo lỗi là khác nhau, nếu nó không được hỗ trợ ( không xác định truy cập so với phương thức xác thực ).

Vì vậy, tôi đã thay đổi plugin xác thực MySQL của mình thành caching_sha2_password(sử dụng cùng một mật khẩu như trước):

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '';
FLUSH PRIVILEGES;

Nhưng điều này gây ra một lỗi khác:

Truy cập bị từ chối cho người dùng 'root' @ 'localhost' (sử dụng mật khẩu: CÓ).

Chuyển về PHP 7.3 và mysql_native_passwordnó hoạt động trở lại.

Tôi đã sử dụng cùng một mật khẩu cho cả hai plugin, cùng một trang web và áp dụng các thay đổi php.ini giống nhau. Tôi tuy nhiên không thay đổi bất kỳ mysqlicấu hình. Nhật ký cho MySQL không hiển thị gì, nhật ký apache2 chỉ hiển thị thông báo lỗi 'Truy cập bị từ chối'.

Liệu php7.4-mysqli có hỗ trợ caching_sha2_passwordkhông? ĐÚNG

Tại sao mật khẩu của tôi bị từ chối và làm cách nào để khắc phục? Xem câu hỏi tiếp theo của tôi

Ngoài ra, nếu MySQLi vẫn không hỗ trợ plugin: Làm cách nào tôi có thể sử dụng mysql_native_passwordvới nó?

Câu trả lời:


5

Tôi đã thử nghiệm điều này và mysqli trong PHP 7.4 không hỗ trợ cacheing_sha2_password.

php -v
PHP 7.4.0 (cli) (built: Nov 29 2019 16:18:44) ( NTS )

Đây là một đoạn mã PHP đơn giản mà tôi đã viết để kết nối với MySQL 8.0.17 đang chạy trong bộ chứa docker (sử dụng cổng 6603):

<?php
error_reporting(E_ALL);
$conn = new mysqli('127.0.0.1', 'root', 'root', '', 6603);
$result = $conn->query("SELECT NOW()");
$now = $result->fetch_row()[0];
echo "$now\n";

Tôi đã xác nhận rằng phiên bản MySQL của tôi đang sử dụng cacheing_sha2_password:

mysql> select user,host,plugin from mysql.user where user='root';
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| root | %         | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+

mysql> select @@default_authentication_plugin;
+---------------------------------+
| @@default_authentication_plugin |
+---------------------------------+
| caching_sha2_password           |
+---------------------------------+

Chạy kịch bản PHP của tôi, nó đã thành công.

php my.php
2019-12-08 18:11:58

Tuy nhiên, khi tôi cố gắng thay đổi mật khẩu ''giống như bạn đã làm, tôi có thể tái tạo cùng một lỗi:

Cảnh báo PHP: mysqli :: __ construc (): Phản hồi của máy chủ không mong muốn trong khi thực hiện cacheing_sha2 auth: 0 in /Users/bkarwin/Document/SO/my.php trên dòng 5

Khi tôi khôi phục mật khẩu, đặt nó thành một chuỗi không trống, nó đã khắc phục vấn đề.

Đừng sử dụng mật khẩu trống.


Hấp dẫn. Tôi đã không sử dụng một mật khẩu trống (sry, nên đã làm cho nó rõ ràng hơn). Nhưng biết rằng nó có thể làm việc đã giúp. Tôi sẽ thử lại, xem tôi có thể tránh Access Deniedvà sau đó quay lại với bạn không.
Chăm

Bạn đặt mật khẩu trống với ALTER USER ... BY ''. Khi tôi thử điều tương tự, nó đặt một mật khẩu trống.
Bill Karwin

... BY '';chỉ là phiên bản rút gọn, tôi thực sự đã nhập... BY 'mySecretPassword';
Minding

Tôi đã thử lại và tôi vẫn gặp vấn đề tương tự Access Deniedmặc dù tôi thực sự sao chép mật khẩu. PHP của tôi đã thực sự được xây dựng trước một ngày của bạn: PHP 7.4.0 (cli) (built: Nov 28 2019 07:27:06) ( NTS )có lẽ đó chỉ là một lỗi?
Chăm

1
Tôi không thể tái tạo điều đó, vì vậy tôi không biết. Tôi thực sự hy vọng cùng một phiên bản PHP được biên dịch cách nhau một ngày không tạo ra sự khác biệt.
Bill Karwin

3

Có một vài cách điều này có thể xảy ra

  1. Bạn đang sử dụng mysql_clientphương thức xác thực. Đây là cách PHP sử dụng để làm điều đó một cách tự nhiên, bằng cách kết nối với MySQL thông qua giao diện MySQL CLI. Máy khách của MySQL sẽ luôn hỗ trợ các phương thức xác thực của riêng nó.
  2. Bạn đang sử dụng MySQLND dưới 7.4. Rõ ràng đây là một cải tiến cho trình điều khiển bản địa đã không được báo trước

    Vâng, điều này chỉ có trong 7.4 ngay bây giờ, do sự phụ thuộc cứng vào ext / hash.

    Vẫn còn một số vấn đề có thể xảy ra với nó.


Điều thực sự làm tôi bối rối, là mọi thứ đều hoạt động tốt trên phần truyền, nhưng mật khẩu của tôi bị từ chối. Cho dù tôi theo nghĩa đen copy dán nó cho mysql_native_passwordcaching_sha2_passwordvà chỉ có một công trình đầu tiên.
Chăm

Bạn có biết làm thế nào để chuyển đổi giữa trình điều khiển gốc và máy khách mysql không?
Chăm

Phụ thuộc vào cách máy chủ của bạn được thiết lập. Các hướng dẫn sử dụng PHP đi qua một số các thiết lập phổ biến.
Machavity

Cảm ơn, tôi đang sử dụng mysqlnd, đây có thể là vấn đề ở đây nên tôi đoán tôi sẽ chờ hỗ trợ đầy đủ.
Chăm

Sẽ rất tuyệt, nếu bạn có thể kiểm tra câu hỏi tiếp theo của tôi .
Chăm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.