phpseclib 3 chấp nhận một tài nguyên luồng đang mở ở vị trí mà hàm khởi tạo SSH/SFTP của nó thường nhận tên máy chủ. Đây là điểm bàn giao công khai cho một kết nối đã được truyền qua proxy.

Đầu tiên, bộ kết nối thiết lập đường hầm HTTP CONNECT hoặc SOCKS tới máy chủ SFTP thực và cổng của nó. Sau đó chuyển luồng đã thiết lập cho SFTP:

use phpseclib3\Net\SFTP;

$sftp = new SFTP($tunnel);

$actualHostKey = $sftp->getServerPublicHostKey();
if ($actualHostKey === false
    || !hash_equals($expectedHostKey, $actualHostKey)) {
    throw new RuntimeException('Unexpected SFTP server key');
}

if (!$sftp->login($sftpUser, $sftpCredential)) {
    throw new RuntimeException('SFTP login failed');
}

$tunnel là một luồng đã kết nối, không phải URL proxy. $expectedHostKey là chuỗi khóa công khai đáng tin cậy của máy chủ, thu được qua quy trình chuẩn bị của ứng dụng, theo định dạng mà phpseclib trả về. Thông tin đăng nhập có thể là mật khẩu được hỗ trợ hoặc đối tượng khóa đã nạp do ứng dụng chọn.

Xác định những gì bộ kết nối trả về

Luồng phải đã dẫn tới máy chủ SFTP. Với HTTP CONNECT, điều này nghĩa là proxy đã chấp nhận đích và toàn bộ tiêu đề phản hồi của proxy đã được tiêu thụ. Với SOCKS, quá trình thương lượng liên quan phải đã hoàn tất thành công. Mọi byte SSH đã đọc vượt qua ranh giới đó phải vẫn khả dụng cho phần triển khai SSH.

Tại thời điểm đó phpseclib thực hiện trao đổi SSH và khởi động SFTP trên cùng luồng. Ứng dụng có thể dùng các thao tác SFTP thông thường. Giao diện hàm khởi tạo tránh phải tạo lớp con ứng dụng với nhiệm vụ thay thế các trường socket nội bộ.

Bài viết liên quan