PHP SFTP應用(二)

SFTP應用(二)

FTP進行文件傳輸須要經過端口進行。通常所需端口爲:

  1. 控制鏈路—TCP端口21。控制器端。用於發送指令給服務器以及等待服務器響應。
  2. 數據鏈路---TCP端口20。數據傳輸端口。用來創建數據傳輸通道的。主要用來從客戶向服務器發送一個文件、從服務器向客戶發送一個文件、從服務器向客戶發送文件或目錄列表。

FTP爲了適應不一樣的網絡環境,支持主動鏈接和被動鏈接兩種模式。這兩種模式都主要針對數據鏈路進行的,跟控制鏈路無關。php

FTP的安全隱患:

  1. FTP服務器軟件漏洞。
  2. 明文口令。
  3. FTP旗標。
  4. 經過FTP服務器進行端口掃描。
  5. 數據劫持。

FTP的安全策略:html

  1. 使用較比安全的系統和FTP服務軟件。
  2. 使用密文傳輸用戶名和口令。
  3. 更改服務軟件的旗標。
  4. 增強協議安全性。

SFTP是Secure File Transfer Protocol的縮寫,是安全文件傳送協議。能夠爲傳輸文件提供一種安全的加密方法。跟ftp幾乎語法功能同樣。
SFTP是SSH的一部分,是一種傳輸檔案至Blogger伺服器的安全方式。它自己沒有單獨的守護進程,必須使用sshd守護進程來完成相應的鏈接操做,因此從某種意義上來講,SFTP並不像一個服務器程序,而更像是一個客戶端程序。SFTP一樣是使用加密傳輸認證信息和傳輸的數據,因此使用SFTP是十分安全的。但因爲這種傳輸方式使用了加密/解密技術,因此傳輸效率比普通的FTP要低得多。在對網絡安全性要求更高時,代替FTP使用。windows

搭建SFTP server【我這裏用的是Windows系統】安全

  • 使用FreeSSHrd;
  • 教程自行百度(很簡單的),我這裏建立了用戶 sun ,密碼141592;地址使用127.0.0.1,端口號 28(22端口被其餘應用佔用了,端口號隨意設置,不要衝突就好),下面我會對此測試。

開啓ssh2擴展【我這裏用的是wamp】服務器

  1. 打印phpinfo();找到你的Architectrue、Thread Safety(enabled 線程;disabled 非線程),後面會用到;網絡

  2. http://windows.php.net/downloads/pecl/releases/ssh2/0.12 打開找到你的對應版本下載下來;ssh

  3. 會有三個文件,libssh2.dll、php_ssh.dll、php_ssh2.pdb。將 php_ssh.dll、php_ssh2.pdb 放到你的wamp/bin/php/ext/ 下;將libssh2.dll 複製到 c:/windows/system32 和 c:/windows/syswow64 各一份測試

  4. 在wamp中的 php.ini中加入 extension=php_ssh2.dll。this

  5. 重啓wamp,擴展打開。加密

注意

  • 下載正確的ssh版本dll;

PHP操做實例

<?php
$strServer = "127.0.0.1";
$strServerPort = "28";
$strServerUsername = "sun";
$strServerPassword = "141592";
$csv_filename = "test.txt";

//connect to server
$resConnection = ssh2_connect($strServer, $strServerPort);

//ssh2_auth_password — Authenticate over SSH using a plain password 
if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword)){
     echo "connected\r\n";
    
    //ssh2_sftp — Initialize SFTP subsystem 
    $resSFTP = ssh2_sftp($resConnection);    

    $resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w');         //獲取句柄
    fwrite($resFile, "Testing");  //寫入內容
    fclose($resFile);   //關閉句柄 
    echo "success\r\n";
}else{
    echo "Unable to authenticate on server";
}
?>

SFTP操做類

<?php

class SFTPConnection {
    private $connection;
    private $sftp;

    public function __construct($host, $port=22) {
        $this->connection = @ssh2_connect($host, $port);
        if (! $this->connection)
            throw new Exception("Could not connect to $host on port $port.");
    }

    public function login($username, $password) {
        if (! @ssh2_auth_password($this->connection, $username, $password))
            throw new Exception("Could not authenticate with username $username " .
                "and password $password.");

            $this->sftp = @ssh2_sftp($this->connection);
            if (! $this->sftp)
                throw new Exception("Could not initialize SFTP subsystem.");
    }

    public function uploadFile($local_file, $remote_file) {
        $sftp = $this->sftp;
        $stream = @fopen("ssh2.sftp://$sftp$remote_file", 'w');  //w

        if (! $stream)
            throw new Exception("Could not open file: $remote_file");

        $data_to_send = @file_get_contents($local_file);
        if ($data_to_send === false)
            throw new Exception("Could not open local file: $local_file.");

        if (@fwrite($stream, $data_to_send) === false)
            throw new Exception("Could not send data from file: $local_file.");
        @fclose($stream);
        return true;
    }
    
    
}

------ 天行健,君子以自強不息!

相關文章
相關標籤/搜索