FTP爲了適應不一樣的網絡環境,支持主動鏈接和被動鏈接兩種模式。這兩種模式都主要針對數據鏈路進行的,跟控制鏈路無關。php
FTP的安全策略:html
SFTP是Secure File Transfer Protocol的縮寫,是安全文件傳送協議。能夠爲傳輸文件提供一種安全的加密方法。跟ftp幾乎語法功能同樣。
SFTP是SSH的一部分,是一種傳輸檔案至Blogger伺服器的安全方式。它自己沒有單獨的守護進程,必須使用sshd守護進程來完成相應的鏈接操做,因此從某種意義上來講,SFTP並不像一個服務器程序,而更像是一個客戶端程序。SFTP一樣是使用加密傳輸認證信息和傳輸的數據,因此使用SFTP是十分安全的。但因爲這種傳輸方式使用了加密/解密技術,因此傳輸效率比普通的FTP要低得多。在對網絡安全性要求更高時,代替FTP使用。windows
搭建SFTP server【我這裏用的是Windows系統】安全
開啓ssh2擴展【我這裏用的是wamp】服務器
打印phpinfo();找到你的Architectrue、Thread Safety(enabled 線程;disabled 非線程),後面會用到;網絡
http://windows.php.net/downloads/pecl/releases/ssh2/0.12 打開找到你的對應版本下載下來;ssh
會有三個文件,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 各一份測試
在wamp中的 php.ini中加入 extension=php_ssh2.dll。this
重啓wamp,擴展打開。加密
注意
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;
}
}
------ 天行健,君子以自強不息!