SFTP cu phpseclib 3 printr-un flux proxy stabilit
Folosiți constructorul public de flux al phpseclib 3 pentru a porni SFTP printr-un tunel HTTP sau SOCKS deja stabilit.
phpseclib 3 acceptă o resursă de flux deschisă acolo unde constructorul său SSH/SFTP ar primi altfel un nume de gazdă. Acesta este punctul public de predare pentru o conexiune deja purtată printr-un proxy.
Mai întâi, conectorul stabilește un tunel HTTP CONNECT sau SOCKS către serverul SFTP real și portul acestuia. Apoi fluxul stabilit este transmis către 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 este un flux deja conectat, nu un URL de proxy. $expectedHostKey este șirul cheii publice de încredere a serverului, obținut prin procesul de pregătire al aplicației, în formatul returnat de phpseclib. Datele de autentificare pot fi parola acceptată sau un obiect de cheie încărcat ales de aplicație.
Definiți ce returnează conectorul
Fluxul trebuie să ducă deja la serverul SFTP. Pentru HTTP CONNECT, aceasta înseamnă că proxy-ul a acceptat destinația și că anteturile complete de răspuns ale proxy-ului au fost consumate. Pentru SOCKS, negocierea relevantă trebuie să se fi încheiat cu succes. Orice octeți SSH deja citiți dincolo de această limită trebuie să rămână disponibili implementării SSH.
În acel moment phpseclib efectuează schimbul SSH și pornește SFTP pe același flux. Aplicația își poate folosi operațiile SFTP obișnuite. Interfața constructorului evită o subclasă a aplicației a cărei sarcină ar fi să înlocuiască câmpuri interne de socket.