不上傳你檔案的工具
由你的瀏覽器強制執行,不是靠我們口頭承諾。
本機處理60 個工具
站上每一個工具都在這裡被交代
這個網站有 62 個工具、分成 14 個分類,其中 60 個把工作完全做在你的瀏覽器裡。我們刻意不逐一列出每個工具的連結 —— 依規劃全部上線後那會是好幾百條,沒有人會讀。下面這張表給出每個分類的確切數字,而每一個例外都在下一段被具名。沒有東西被略過:各分類的數字加起來就是全部 62 個工具。
- PDF 工具10 個全部本機處理
- 圖片工具20 個全部本機處理
- 影片工具4 個全部本機處理
- 音訊工具6 個全部本機處理
- 文件轉換3 個全部本機處理
- 壓縮檔工具1 個全部本機處理
- 文字工具3 個全部本機處理
- 開發者工具1 個全部本機處理
- 產生器4 個全部本機處理
- 單位換算5 個全部本機處理
- 網路工具3 個裡有 1 個本機處理
- SEO 工具2 個全部本機處理
例外,逐一具名
這 2 個就是「不是純本機」的完整清單。這裡選擇逐一寫出名字而不是用一句概述帶過,因為一個帶著沒說出名字的例外的隱私主張,是沒辦法被查證的。
幾個最常被用的
這 8 個是 60 個本機工具裡流量最大的。放在這裡是當捷徑用,不是「只有這些」—— 上面每一個分類都通往它自己的完整清單,而清單上每個工具都帶著徽章。
這個網站上的每一個檔案工具都在這一頁被交代。不是「大部分」,是全部。每一個都在你現在正在閱讀的這個瀏覽器分頁裡完成工作:你的檔案由你自己的瀏覽器從磁碟讀取、用你自己的處理器處理、再寫回你自己的下載資料夾。它從頭到尾沒有被傳給我們 —— 而這句話最重要的部分是:你不需要相信我們說的。
這件事實際上是怎麼被強制執行的
這個網站的每一頁都帶著 Content-Security-Policy 標頭。關鍵的那一項是 connect-src,它列出這個頁面被允許建立網路連線的來源。我們的寫法是:connect-src 'self' blob:。
這份清單裡沒有任何外部來源。沒有分析服務主機、沒有 CDN、沒有儲存空間。'self' 指這個網站自己;blob: 指頁面在你自己記憶體裡建立的資料,例如它正要交給你下載的那個轉檔結果。因為這份清單是窮盡的,帶著這個標頭的頁面就不可能連到清單以外的任何地方 —— 不論它的腳本試圖做什麼。
執行這條限制的是你的瀏覽器,不是我們的程式。如果這些頁面上的某支腳本試圖把你的文件 POST 到某處,瀏覽器會在任何東西被送出之前就拒絕建立連線,並在 console 記下一筆違規。所以這裡講的不是「我們選擇不傳你的檔案」,而是「你的檔案一個位元組都離不開這台機器」。這個保證因此不取決於我們夠不夠小心、也不取決於這個網站換了老闆之後是否還誠實 —— 它取決於一個你本來就信任、而且跑在你這一側的機制。
這個說法刻意比「檢視原始碼在頁面上找不到任何第三方位址」窄,而它窄的原因是後者並非永遠為真。我們的 CDN 會把它自己的分析腳本標籤插進少數幾種回應裡,而我們選擇在下面具名寫出是哪幾種,而不是讓你自己發現。它發生的時候,瀏覽器會依同一條 connect-src 規則在任何請求送出之前就擋掉那支腳本,所以沒有資料離開 —— 這正是我們寧可把承諾押在機制上、而不是押在「原始碼長什麼樣」的原因。機制在每一種情況下都成立;外觀不是。
一分鐘內自己驗證
打開站上任何一個工具,按 F12 開啟開發者工具,切到 Network 分頁,按清空讓清單變空,然後選一個檔案並執行轉檔。接著讀那份清單:每一列的位址都會是這個網站上的東西 —— 頁面、樣式表、JavaScript,某些工具還有一個 WebAssembly 模組。數一數指向其他主機的列有幾筆,你要找的答案是零。按大小排序是同一件事最快的版本:一筆夾帶你檔案的請求,體積必然接近你的檔案,而清單上沒有這樣一筆。
更強的測試是把網路完全斷掉。先在有網路的情況下載入一次工具,然後關掉 Wi-Fi 再重新整理。頁面照樣能用、照樣能轉,因為完成這件事所需要的程式已經在你的機器上了。一個私下在上傳你檔案的軟體,不可能有這種行為。
你也可以直接檢查那條政策:在 Network 分頁點開頁面本身那一筆請求,讀它的回應標頭。Content-Security-Policy 就在那裡,而且對每一位訪客都一樣。如果你想看到的不只是標頭而是「它真的在執行」,把 Console 分頁也打開 —— 一筆被擋下的請求會在那裡顯示成一則政策違規,並寫出被拒絕的那個位址。
為什麼那些常見的網站做不出這個承諾
多數知名轉檔站是在他們自己的伺服器上執行轉換。那是個正當的工程選擇 —— 它讓他們能支援瀏覽器辦不到的格式,例如任何需要完整文書軟體的東西。但它會帶來一些後果,而那些後果是架構自動導致的,不是誰的居心問題。
伺服器處理是按檔案計費的,這就是為什麼那些網站要限制免費檔案大小、限制每小時次數、並加上浮水印。你的檔案必須在他們的磁碟上存在一段時間,這就是為什麼他們的條款會寫保留期限。結果通常放在一個「任何人拿到都能開」的網址後面。而且因為你的檔案已經有一份離開了你的掌控,你現在得去信任他們的保留政策、他們的存取控制,以及他們過去的資安事故紀錄。
這一頁上的工具完全沒有這些取捨,因為檔案根本沒有離開。這也是為什麼這裡沒有大小上限、沒有每小時額度、不用註冊、不加浮水印:處理對我們沒有成本,所以沒有東西需要配給。
這裡的因果關係值得講清楚,因為它跟一般的說法剛好相反。伺服器不是因為「轉檔需要它」才存在。伺服器存在,是因為伺服器成本才讓付費方案變成必要 —— 而一個必須配給的免費方案,才會讓付費方案看起來划算。本機處理拿掉了成本,也就一併拿掉了「需要配給任何東西」的全部理由。
我們找得到最難的那個案例,結果也不需要伺服器
對上面這些說法最直接的反駁是:瀏覽器端轉檔只能處理簡單格式,真正困難的格式終究需要伺服器軟體。我們原本也這樣假設。文書文件就是那個具體案例:把 Word、Excel、PowerPoint 轉成版面忠實的 PDF,一般都被描述為需要 LibreOffice 那種等級的完整文書引擎,而那沒辦法在瀏覽器分頁裡跑。
所以我們在決定之前先做出來實測。版面留存率的結果是:履歷類文件 99.7%、從真實世界收集來的 Word 檔 98.3%、繁體中文文件 97.2% —— 繁中是我們原本預期會失敗的那一組,因為它靠的是字型替代與斷行規則,而不是單純的幾何。
真正意外的是速度。瀏覽器端轉檔依文件複雜度落在 13 到 353 毫秒之間。用來對照的伺服器端 LibreOffice 流程處理同一批檔案要 1.9 到 6.6 秒,而且那還沒有算上傳文件與下載結果的時間。本機並不是「拿速度換隱私」的妥協,它是大幅更快 —— 因為它從來不必付一次來回傳輸的代價,也不必排隊。
這組實測就是這一頁敢寫「全部」而不是「大部分」的原因。而我們從它得到的結論就是上一段那句話:這個產業在這類轉檔上使用伺服器,是因為這個產業的營收方式,不是因為瀏覽器做不到。
三件可以分開查證的事
第一是機制。每一頁的 Content-Security-Policy 標頭在 connect-src 裡沒有列出任何外部來源,而執行它的是你的瀏覽器 —— 它會在任何往外的連線被建立之前就拒絕。這三件裡只有這一件完全不需要信任我們,而這一頁的承諾就是押在它上面,不是押在「原始碼長什麼樣」——後者是比較弱的檢查方式,而且如下面那個例外所示,它並非永遠為真。
第二是對照。打開任何一個知名轉檔站的隱私權政策或服務條款,去找「保留期間」與「授予我們處理該檔案之權利」那兩段。它們沒有被藏起來,它們只是「檔案放在別人磁碟上」這件事的必然結果。然後回來找這個站的對應條文,並注意到這裡沒有東西可以寫。
第三是上面那組實測數據。它是我們能夠直接排除「可是困難格式需要伺服器」這個說法的依據,而不是只用嘴巴否認。
邊界在哪裡
這個網站上有兩個工具確實需要網路,而它們已經在上面的例外清單裡被逐一具名,不是留給你自己去發現:查你的公開 IP 位址,以及量你的連線速度。這兩件事在本機做不到 —— 你的公開位址在定義上就是遠端伺服器看到的東西;而頻寬只能對著一個會收發資料的對象量測。這兩頁都沒有檔案輸入欄位,所以它們在原理上就不可能上傳任何文件。
那兩個帶的是不同的徽章,也有各自誠實的說明。我們寧可把邊界講清楚,也不要把一個主張延伸到它不再能被驗證的程度。一個帶著沒說出口的例外的隱私承諾,比一個把邊線畫清楚的承諾更糟 —— 這也是為什麼這一頁的例外清單是由「決定每個工具頁顯示哪個徽章」的同一份資料產生的,它不可能跟徽章不一致。
還有一個例外,而它跟任何工具都無關,是關於「原始碼裡有什麼」。我們的 CDN 會把一支來自 static.cloudflareinsights.com 的分析腳本標籤插進它被允許改寫的 HTML 裡。我們在這個網站的每一頁都靠「要求中介不得改寫回應主體」把它壓下去,而且有效:檢視任何一個工具頁的原始碼,那個位址都不在裡面。但這道抑制蓋不到兩種回應。第一種是主機平台針對「這個網站上不存在的位址」自己產生的「找不到頁面」回應 —— 平台會用它自己的值換掉那個關鍵標頭。第二種是我們刻意保留一頁不做抑制,把它當成常設的測試對象,好讓我們自己的監控永遠有一個能運作的樣本可以對照;如果把它拿掉,那條盯著這支腳本的檢查就會永遠通過,也就再也偵測不到任何事情。
這個例外不改變的是那個保證。上述兩種回應同樣帶著相同的 Content-Security-Policy,所以瀏覽器會拒絕載入那支腳本,也不會對那個位址發出任何請求。你可以當場確認:在網址列輸入一個這個網站上不存在的位址,打開 Console 分頁,你會看到一則政策違規,寫著某支腳本被拒絕了。那是機制正在運作,不是失效。我們主動告訴你這件事,因為一個「你檢視原始碼就能推翻」的說法本身就是不該講的說法 —— 即使它底下那個真正的承諾(你的檔案不會被傳出去)完全成立。
常見問題
有什麼能阻止你們以後改掉?
沒有什麼能阻止我們改自己的網站,但你會看得出來。那條政策就在每一頁的回應標頭裡,而「沒有上傳請求」在開發者工具裡看得見 —— 所以這個主張在每次造訪時都可以重新驗證,不是一次性的保證。
「不上傳」是指完全沒有任何資料到你們的伺服器嗎?
你的瀏覽器必須抓取頁面、樣式表與程式碼,所以主機層當然有標準的請求記錄,每個網站都有。永遠不會到我們這裡的是你檔案的內容。
我在你們某一頁的原始碼裡看到 cloudflareinsights.com 的腳本,這不就打破承諾了嗎?
沒有,而這件事值得把原因講清楚。那個標籤是我們的 CDN 插進去的,不是我們寫的,而且它只出現在兩種回應裡:一是「這個網站上不存在的位址」所產生的找不到頁面回應,二是我們刻意保留一頁不做抑制、當成自家監控的測試對象。這兩者同樣帶著相同的 Content-Security-Policy,所以你的瀏覽器會拒絕載入那支腳本,也從不對那個位址建立連線 —— 你可以在 Console 分頁親眼看到它被拒絕。沒有任何工具頁含有那個標籤,而在每一種情況下,你正在轉換的檔案都留在你的機器上。它被寫在上面「邊界在哪裡」那一段,因為我們寧可自己講出來,也不要讓你發現我們沒講。
有檔案大小上限嗎?
我們沒有設。天花板是你自己裝置的記憶體,因為檔案是在那裡處理的。非常大的檔案在桌機上可能成功,在手機上可能失敗。
為什麼這些工具可以離線使用?
因為完成轉換所需要的一切都已經下載並快取在本機。這是本機處理的直接結果,也是「沒有伺服器參與」最簡單的證明。
結果會被加浮水印或有任何限制嗎?
不會。浮水印與每小時額度的存在目的是攤平伺服器成本或推銷付費方案。當工作跑在你的機器上,這兩件事都不成立。