多數人以為 FTP 跟 SFTP 的差別只在傳輸速度或介面好不好用,其實最根本的差距,在於密碼與檔案內容有沒有被加密,連接埠與認證方式也跟著不同。
如果主機商的後台同時列出 FTP 和 SFTP 兩個連線選項,大部分人會直覺選熟悉的那一個。問題是,用 FTP 登入時輸入的帳號密碼是用明碼傳送的,連正在上傳、下載的 wp-config.php 裡的資料庫密碼也一樣,只要有人在同一段公共網路上稍微攔截封包,這些內容就等於攤在眼前。FTP(File Transfer Protocol)是 1985 年就定案的老牌檔案傳輸協定,設計目的單純是把檔案送上遠端主機;SFTP(SSH File Transfer Protocol)則是架在加密的 SSH 連線之上,同樣能上傳下載檔案,差別在於整個過程都被封裝進同一條加密通道。台灣的 TWCERT/CC 甚至把 FTP 這類「公開曝露的服務」跟遠端桌面、VNC 並列,建議這類服務啟用多因素身份驗證並記錄登入活動。
弄懂這兩者的差異出在哪個環節,才知道該不該向主機商要求開通 SFTP、換過去之後還有什麼設定不能省。
FTP 是什麼?
很多人第一次接觸「把檔案傳到網站」,是照著某篇主機商教學,打開 FileZilla 之類的用戶端輸入帳號密碼。這個當下用的多半就是 FTP。它負責把整個網站需要的東西搬上遠端主機:安裝 WordPress 核心程式、上傳外掛與佈景主題的壓縮檔,或是直接打開某個檔案改幾行程式碼,都靠它。
FTP 在 RFC 959 裡正式定義,發布於 1985 年 10 月,作者是 Jon Postel 與 Joyce K. Reynolds,同時也是 Internet Standard STD 9 的一部分。這份規範開宗明義寫下 FTP 的四個設計目標:促進檔案分享、鼓勵透過程式間接使用遠端電腦、屏蔽不同主機檔案系統之間的差異,以及可靠且有效率地傳輸資料。換句話說,FTP 從一開始要解決的問題是怎麼把檔案送到另一台電腦,不是怎麼確保沒有人偷看。
這份規範還有一個底層設計,對後面的加密問題影響很大:FTP 把控制指令(登入、切換目錄、下指令要對方做什麼)跟實際傳輸的資料,拆成兩條獨立連線,指令走一條,檔案內容走另一條,各管各的。也正因為這套設計幾十年沒有大改,再加上許多老主機面板、教學文章長年預設用它,FTP 到現在仍然是不少人第一個接觸、也最容易繼續沿用下去的選項。
SFTP 建立在 SSH 加密通道之上
SFTP 聽起來像是 FTP 加了個 S 字、順手升級的版本,實際上兩者的技術路線完全不同。SFTP 全名是 SSH File Transfer Protocol,不是 Secure FTP 的簡稱,它是 SSH(Secure Shell)這個加密協定家族底下的一個子系統,平常用來遠端登入伺服器下指令的那套 SSH,傳檔案時走的正是同一套加密機制。
因為指令與檔案資料都封裝進同一條 SSH 加密通道,SFTP 連線只需要一個埠,走 22 號埠,跟伺服器管理用的一般 SSH 連線共用,不像 FTP 得另外處理資料傳輸的問題。
SFTP 的身世,有一個技術冷知識特別能看出來。定義 SFTP 協定細節的草案文件(draft-ietf-secsh-filexfer)前後修訂到第 13 版,定義了版本 3 到版本 6 的規格,卻始終停留在 IETF「work in progress」的草案狀態,最後一版落在 2006 年,沒有像 FTP 的 RFC 959 那樣正式定案成標準文件。但這不影響它成為業界實際採用的做法,像 OpenSSH 就是照其中 draft-02 定義的版本 3 實作,業界一樣把它當成標準在用。
FTP 從設計之初就不打算加密資料
FTP 的控制連線與資料連線裡,從頭到尾都沒有加密這個環節——這不是設定沒開對,是規範本身從 1985 年定案的那一刻起就沒把加密算進去。
登入時輸入的帳號密碼是明碼傳送,只要有人在傳輸路徑上攔截封包,就能直接看到完整的帳密。不只密碼,傳輸中的檔案內容本身也是明碼,上傳或下載 wp-config.php 的當下,裡面存放的資料庫帳號密碼等於一起用明碼傳出去。
WordPress 開發者文件裡的資安強化指南(Hardening WordPress)建議,連線到伺服器時只要主機商有提供,就應該改用 SFTP 加密;使用 SFTP 跟 FTP 的操作方式一樣,差別在於密碼與其他資料在傳輸過程中會被加密,代表密碼不會用明碼傳送,也無法被攻擊者攔截。同一份文件也直接點名網路環境的風險,像是在網咖用未加密的連線(不論有線無線)傳送密碼,這樣的網路不能算是受信任的網路。照這個標準來看,咖啡廳、機場這類公共 Wi-Fi 也屬於同一種不受信任的環境。

台灣的 TWCERT/CC(台灣電腦網路危機處理暨協調中心)在防護建議中,把 FTP 跟遠端桌面協定、VNC 並列,列為「任何公開曝露的服務」的例子,建議這類服務啟用多因素身份驗證並記錄系統登錄活動;同一份防護建議也要求服務連線必須加密。FTP 會不會被盯上,不是猜測,是 TWCERT/CC 已經點名的風險項目。
FTP 與 SFTP 連接埠不同,防火牆設定也要跟著調整
FTP 跟 SFTP 除了加不加密,連走的連接埠與連線通道數量都不一樣,這也是為什麼很多人反映 FTP 連線設定比較容易出狀況。
FTP 固定用 21 號埠傳送指令,另外還要再開一條資料連線來傳輸檔案內容:主動模式由伺服器主動連回用戶端指定的資料埠,被動模式則動態協商出一個高位埠,兩條通道各走各的。這套控制連線與資料連線分離的設計,寫在 RFC 959 裡從一開始就是這樣安排。防火牆或 NAT 環境如果沒有正確處理這第二條資料連線,FTP 傳輸就容易中斷或連不上,這是不少人維護老主機時碰過的困擾。
SFTP 因為是 SSH 的子系統,指令與檔案資料擠在同一條連線裡,固定走 22 號埠,不必額外協商資料埠,設定起來自然單純不少。

FTP 認證只能用密碼,SFTP 能換成金鑰
登入方式的安全上限,是另一個容易被忽略的差異。
FTP 原始規範裡,登入驗證靠的是 USER 與 PASS 這一組指令,也就是帳號加密碼,沒有其他驗證方式可以選。SFTP 因為架在 SSH 上,除了沿用帳號密碼登入,也能改用 SSH 金鑰驗證:先產生一組公鑰與私鑰,公鑰放在主機那端,私鑰留在自己的電腦裡,登入時靠這組金鑰互相驗證身份,不必每次輸入密碼。
金鑰登入的好處不只是省下打密碼的步驟。密碼從頭到尾不會出現在傳輸過程裡,自然也不怕被竊聽或暴力破解猜中,對安全等級要求比較高的場景來說,是常被優先採用的做法。

FTPS 這個名稱常被誤認成 SFTP
FTPS 這三個字看起來像 SFTP 的別名,實際上是兩套完全不同的架構,選錯很容易讓人誤以為自己已經在用加密連線。
FTPS 全名 FTP Secure,也叫 FTP over SSL/TLS,做法是在既有的 FTP 協定外面加掛一層 SSL/TLS 加密;SFTP 則從頭到尾是另一套協定,架在 SSH 之上,兩者的技術血統從一開始就不同。因為 FTPS 還是沿用 FTP 原本控制連線與資料連線分離的架構,只是外面多包一層加密,實際安全程度會受伺服器與用戶端的配置方式影響,不像 SFTP 單一加密通道那樣一致。

主機商列出的連線選項裡,FTPS 和 SFTP 拼字相近,判斷要用哪一種,得看清楚字面是哪三個字母,別因為名稱都帶個 S,就當成同一件事。
主機控制台通常看得出 SFTP 有沒有開放
主機商有沒有開放 SFTP,通常不必特地打電話問,你只要先到後台看一眼多半就有答案。
不分品牌,常見的 cPanel、Plesk 或主機自有的控制面板,通常會在 FTP 帳號或 SSH 存取設定頁裡,一併列出 SFTP 的連線資訊,包括主機位址、22 號埠、帳號密碼或金鑰設定。如果你把整個面板翻過一遍都找不到 SSH 或 SFTP 相關的字樣,才需要主動聯絡主機商客服,詢問是否提供、或是不是要額外申請開通。
很多人以為只要 FTP 連得上主機,就等於在用安全連線,但這其實是兩回事。FTP 跟 SFTP 是分開的兩個選項,你要在用戶端軟體裡明確選對協定,不能只看連得上就假設安全性沒問題。
從 FTP 切換到 SFTP,改的只是連線協定與連接埠
把 FTP 換成 SFTP,實際上要調整的地方比你想像中少,多半停留在連線設定,不牽涉重灌任何東西。
多數現成的 FTP 用戶端軟體,像 FileZilla、Cyberduck 這類同時支援雙協定的免費工具,介面操作方式一樣,差別只在連線設定裡把協定選項從 FTP 改成 SFTP,連接埠從 21 改成 22。帳號密碼通常沿用主機商原本提供的資訊;如果主機商鼓勵你改用金鑰登入,就另外照它的說明設定金鑰,這只是協定層級的切換,不必逐欄位重新設定整個連線。

換過去之後,因為多了一層加密運算,連線或大量傳輸檔案時可能感覺比 FTP 略慢一點,這是用安全性換來的合理取捨,不是連線出了問題。
傳輸之後,wp-config.php 的權限同樣不能放鬆
換成 SFTP,只解決了傳輸途中被攔截的風險;檔案本身放在伺服器上,權限設定是另一層獨立的防線,兩者要一起顧,做了一件不代表全部安全。
同一份 WordPress 資安強化指南建議,一般資料夾的權限設在 755、一般檔案設在 644,這是多數網站檔案適用的基準。wp-config.php 因為存放資料庫帳號密碼等機敏設定,建議設成比一般檔案更嚴格的權限,通常是 400(只有擁有者能讀取)或 440(擁有者與同群組可讀)。

除了調整權限,同一份指南還提到兩個做法可以進一步降低風險:一是把 wp-config.php 移到 WordPress 安裝目錄的上一層;二是在 .htaccess 最上方加一段規則,擋掉外部直接存取這個檔案:
<Files "wp-config.php">
Require all denied
</Files>Code language: plaintext (plaintext)
這段規則的作用,是讓任何人直接在瀏覽器輸入這個檔案的網址都拿不到內容,等於在權限之外再多一道防線。
把 FTP 換成 SFTP,解決的是傳輸途中會不會被攔截這一段;連接埠、認證方式、傳輸後的檔案權限,則是另外幾道各自獨立、卻同樣重要的關卡。這幾件事沒有哪一項可以取代另一項,主機商的後台只要看得到 SFTP 這個選項,就幾乎沒有理由繼續讓帳密和 wp-config.php 用明碼在網路上跑。
