網站安全 / 存取控制

你的網頁其實沒鎖:公開資訊、付費內容、機密隱私該放哪一層

公開資訊、付費內容、機密隱私該放在不同的防護層。六個等級每一層都對照真實技術,說清楚它擋得住什麼。

這篇在講什麼

很多人以為加了 noindex 就等於把網頁鎖起來了。這篇用房屋安全的六層比喻,把「搜尋不到」跟「進不去」這兩件常被混在一起的事分開,每一層都對照到真實技術,說清楚它擋得住什麼、擋不住什麼。最後分開處理工作人員、長期客戶、付費學員這三種人,因為它們的正確解法完全不同。

適合誰
  • 有人跟你說「加 noindex 就搜尋不到了,很安全」,你隱約覺得哪裡怪。
  • 你要幫學員開一區「登入才看得到講義」,但不確定怎麼做才是真的擋住。
  • 你有工作人員要進後台,也有幾位長期客戶要看專屬內容,兩種人的解法你分不清楚。
  • 你發過「網址很長很難猜」的私密頁,現在想知道那樣到底夠不夠。
  • 你要跟客戶承諾內容安全,但你不確定能承諾到哪裡。
你可以帶走什麼
  • 六層存取分級的判斷順序,每一層都對照真實技術,不只是比喻。
  • 一組判斷:哪些內容該放哪一層,問自己一句話就知道。
  • 工作人員、長期客戶、付費學員三種人的對照表,各自該用哪一招。
  • 兩個你自己就能做的驗收測試,測完才知道有沒有真的擋住。
  • 一段誠實的邊界說明:這套方法保證什麼、不保證什麼。

一個具體問題

我打算幫講師、顧問和商用客戶架網站。他們的需求長得很像:公開訪客要看得到講師介紹、課程介紹和公開文章;付費學員登入之後才能看到完整講義和簡報;工作人員登入之後可以進後台。一堂課大概一百位學員。

這三種人湊在一起,就會撞出一個必須先回答的問題:這一百個人、那幾個工作人員、還有路過的陌生訪客,網站要怎麼分辨他們,而且分辨錯了會怎樣。

核心判斷先決定每一種人能看到什麼,再決定用什麼技術去擋。反過來做,你會先挑一個工具,然後把內容硬塞進那個工具做得到的形狀。

選平台這件事我另外寫了一篇,這篇只處理「誰能看到什麼」。

延伸閱讀

能不能被找到,跟找到之後能不能進去

這是整篇最重要的一組區分,也是最容易被說反的一組。

第一件事能不能被找到

講的是曝光。你的網址有沒有出現在 Google 搜尋結果、有沒有被 AI 摘要引用、有沒有掛在你的導覽列上。

第二件事能不能進去

講的是存取控制。一個人拿到網址、貼進瀏覽器之後,伺服器會不會把內容送給他。

noindexrobots.txt、隨機網址、不放 sitemap,這四招全部都只影響第一件事。它們一個字都沒有動到第二件事。具體來說:

  • noindex 的真正作用是告訴遵守規範的搜尋引擎「請不要把這一頁放進索引」。它是一個請求,對象是爬蟲(搜尋引擎派出來自動讀取網頁的程式)。任何人直接打開這個網址,伺服器照樣把完整內容送出去。
  • X-Robots-Tag 是同一件事的 HTTP 標頭版本。HTTP 標頭是伺服器送出檔案時附帶的一組說明,訪客看不到,但爬蟲讀得到,所以它適用於 HTML 以外的檔案(例如 PDF)。作用範圍一樣,只管索引。
  • robots.txt 的真正作用是告訴爬蟲哪些路徑不要抓。它是公開檔案,任何人都可以打開「你的網域/robots.txt」看裡面寫了什麼。所以把敏感路徑寫進 robots.txt,效果是反過來的:你等於公布了一份「這裡有東西」的清單。
  • 隨機網址能降低什麼風險:它降低「被隨機猜到」和「被搜尋到」的機率。它擋不住的是「拿到網址的人轉傳給別人」。而網址一旦離開你手上,你沒有辦法收回,因為那個網址本身就是唯一的通行證。
請當成硬規則記住robots.txt 不能作為敏感資料的保護機制。正確的心智模型是:這些技巧把你的房子從地圖上抹掉,但房子的門還是開著的。

六層房屋安全

我用房子來說明六個層級。每一層後面我都會接上真實的技術,因為比喻只能幫你進門,不能取代做法。

先講一件容易誤解的事這六層是六種存取狀態,防護強度大致由淺到深,但第三層是例外。第三層看起來比第二層更安全,實際上沒有,它是一個常見的誤用示範。我把它放進來,是因為太多網站正停在那一層還以為自己安全了。看的時候請把它當成警示,不要當成一個可以選的等級。

第一層:公開展示間

任何人都能找到,任何人都能進來。這是設計上就要被看到的東西。

對應的真實做法:公開網站、產出 sitemap、開放搜尋引擎索引、GitHub Pages 公開內容、公開的 Cloudflare Pages 站台。

適合放:講師介紹、課程介紹、公開文章、招生頁、聯絡方式。這一層要主動做好曝光,不要不小心把它擋掉。

第二層:從地圖上抹除的房子

房子還在,門也還開著,只是地址很難被發現。

對應的真實做法:隨機且不容易猜的網址、HTML 的 noindexX-Robots-Tag 標頭、依需要調整 robots.txt、不放進公開 sitemap(給搜尋引擎看的網站地圖,列出你希望被收錄的所有頁面)、不掛在導覽列與書籤頁。

這一層降低的是曝光,沒有提升房子本身的防禦力拿到網址的人,一律進得去。適合放時效性的校稿頁、給特定對象看過就算了的一次性內容、內容外流不會造成損失的東西。

第三層:拉起紅線

門口拉了一條紅線,上面寫「請勿進入」。但東西已經擺在門內,而且門根本沒鎖。

對應的真實做法:用 CSS 把區塊隱藏、用 JavaScript 決定要不要顯示、在前端判斷「這個人是不是會員」、把完整講義整份寫進 HTML,再用一顆按鈕決定顯示或不顯示。

這一層要非常小心只要資料已經送到瀏覽器,懂得開發者工具的人就可能取得它。按右鍵看原始碼、打開 Network 分頁、把 display:none 改掉,這些都是幾秒鐘的事。

前端的顯示與隱藏,是體驗設計,不是存取控制。它可以拿來做「先看摘要,點開看全文」這種介面互動,不能拿來擋付費內容。

第四層:有警衛的鐵門

有人站在門口。你要先證明你是誰,警衛確認名單上有你,才會放你進去。在你通過之前,請求根本不會抵達你的網站。

對應的真實做法:Cloudflare Access、Email OTP(收一次性驗證碼)、Google 或其他身分提供者(你已經有帳號的服務,借它來證明你是誰,就是常見的「用 Google 登入」)登入、Allow policy 白名單(事先列好誰可以進來,沒列到的一律擋)、預設拒絕、Session 管理(登入之後這個狀態能維持多久)與權限撤銷。

適合:工作人員、固定合作夥伴、少量長期客戶、內部後台、審稿站、固定客戶專區。

Cloudflare Access 的免費席次上限與每人單價,還有它跟另外兩家的存取保護能力差在哪,在另一篇:網站放 GitHub、Vercel 還是 Cloudflare?三家免費額度、商用限制與功能差異

這一層有三個實務提醒,都是會出事的地方:

  1. 所有的備用入口都要一起保護。你的正式網域、pages.devvercel.app 的預設網址、原始主機的 IP、還有你的 API 端點,全部都要一起關起來。只保護正式網域,等於前門裝了鐵門,後門還開著。
  2. 席次是登入席次。Access 算的是通過驗證的人,公開訪客不算。不要把「免費方案的席次上限」誤解成「網站只能服務這麼多位訪客」,這兩個是完全不同的量。
  3. 人數規模要事先算。席次一旦被佔用,要手動移除或設定自動到期才會釋放。一百位學員全部走 Access 這條路,成本結構會跟你想的差很多。

第五層:大樓門禁加房間權限

每個人有自己的門禁卡。刷卡進大樓之後,你的卡只能開你自己那間房。買了第一堂課的人,第二堂課的門刷不開。

這一層對應的是你自己網站的會員與授權機制,Cloudflare 或 Vercel 都不會直接給你這個。要拆成兩件事:

AUTHENTICATION驗證

確認這個人是誰。email 加一次性驗證碼、第三方登入、密碼,都屬於這一層。

AUTHORIZATION授權

確認這個人能看什麼。要靠課程購買紀錄與角色欄位(staff/student/customer)來判斷。

判斷流程長這樣:

  1. 未登入的訪客:伺服器只回傳課程介紹。完整講義的內容從頭到尾沒有離開伺服器。
  2. 已登入但沒買這堂課:伺服器回傳 403(代表「認得你,但這個你不能看」的狀態碼),或是一個「你還沒購買這堂課」的提示頁。
  3. 已登入而且已購買:伺服器確認購買紀錄之後,才把完整講義送出去。
  4. staff:伺服器確認 staff 權限之後,才送出後台。
關鍵字是「伺服器端」這一步如果放在瀏覽器做,就退回第三層了。在 Cloudflare 上,這一層的零件對應是:Workers 負責寫判斷邏輯,D1 負責存使用者、角色、課程與購買紀錄。程式要自己寫。

第六層:房屋裡的保險箱

人進了房間,也不代表能直接把櫃子裡的東西搬走。保險箱要另外開,而且每次開都要重新確認。

對應的真實做法:R2 私有儲存空間、檔案沒有公開網址、每次下載由伺服器產生一個短效簽名網址(一條臨時的專屬連結,帶著一組會過期的通行碼,例如十分鐘後就打不開)、網址過期就失效、每一次下載都重新檢查權限、留下下載紀錄、必要時在檔案上加浮水印、隨時可以撤銷權限。

適合放:完整講義、付費教材、可下載的檔案。

為什麼要多這一層?因為第五層保護的是「頁面」,而檔案常常是另一條路。如果你的 PDF 放在一個固定的公開網址上,那頁面擋得再好,只要有人把那個 PDF 網址複製出去,就結束了。短效簽名網址讓那個連結在幾分鐘後自動失效,轉傳出去的價值就大幅下降。

Vercel Authentication 跟會員登入的差別

Deployment Protection 底下的 Vercel Authentication,擋的是「有沒有 Vercel 帳號、而且是不是這個團隊的成員」。它是給開發團隊看預覽版用的門,不是給你的付費學員用的會員系統。

Password Protection 在 Pro 上是加購項目,而且它是整站一組密碼,沒有個別身分、沒有誰買了哪堂課的概念、也沒有辦法單獨撤銷某一個人。

如果你要的是「A 學員能看第一堂、B 學員能看第一和第二堂」,這兩個功能都做不到。那需要你自己的會員與授權機制,後面第五層會講。

我的半私密網頁做法,以及它的限制

我自己有一套做法,內部叫它「半私密網頁」。這是我給它取的名字,不是業界通用詞。它長這樣:

  • 使用隨機、不容易猜到的網址
  • HTML 加 noindex
  • X-Robots-Tag
  • 依頁面需求設定 robots.txt
  • 不放到公開 sitemap、書籤頁或導覽列
  • 不開登入,也不開伺服器存取保護
對照上面的六層這套半私密網頁的做法,完整落在第二層。它是一棟從地圖上被抹掉的房子,門是開著的。

半私密網頁適合放什麼

  • 給既有合作成員看的進度頁、對齊頁
  • 一次性的審稿頁、校稿頁
  • 內容外流不會造成金錢或信任損失的資料
  • 需要「拿到連結就能直接開,不要卡登入」的臨時交付

它的好處是真實存在的:零成本、零設定、對方不用註冊帳號、手機點開就看得到。對於「五分鐘後就要在會議上一起看」這種場景,它是對的工具。

哪些內容不該用半私密網頁裝

  • 付費學員的完整講義。這是我的課程收入本體,第二層擋不住轉傳。
  • 含報價、分潤、談判紀錄的內部文件。這類外流的後果是關係損失,不只是內容損失。
  • 含個人資料的名單。任何有真實姓名、聯絡方式、健康或財務資訊的東西,都不該只靠網址難猜。
  • 需要事後撤銷的東西。半私密網址一旦發出去就收不回,你唯一能做的是換一個網址,然後重新通知所有人。
一句話判斷問自己:這份東西被完整轉貼到公開群組,我會不會有損失?會的話,它至少要走第四層或第五層。

工作人員、長期客戶、付費學員:三種人,三種解法

這三種人常常被放在同一句話裡討論,但它們的正確解法完全不同。

對象人數規模建議層級為什麼
工作人員少數、固定、你認識第四層 Cloudflare Access名單短、變動少、不需要自己寫程式,設定一次就好
固定合作夥伴少數、固定第四層 Cloudflare Access用 Allow policy 白名單直接列 email
少量長期客戶個位數到數十第四層 Cloudflare Access在席次可控範圍內,這是最省工的做法
付費學員一堂課約一百人,會一直換第五層自建會員加第六層私有檔案人數會成長、名單一直換、而且要判斷「誰買了哪一堂」

為什麼付費學員不走 Access?三個理由:

  1. 席次會被佔滿。上完課的學員仍然佔著席次,除非你手動移除,或事先設定了自動到期。
  2. Access 沒有「誰買了哪一堂課」的概念。它判斷的是「這個 email 在不在允許名單上」,沒有課程與購買的關聯。
  3. 成本結構不對。如果每人每月要付費,一百位學員的年度成本會遠高於自建。(實際單價官方定價頁目前沒有公開,請自行向官方確認後再算。)

反過來,工作人員為什麼不自建?因為五個人的名單,寫一套會員系統的成本遠高於在後台加五個 email。

一句話收固定的少數人用門禁,變動的多數人用會員系統。

那我可以叫 AI 幫我寫嗎

可以。第五層需要的東西(登入、購買紀錄、判斷這個人能看哪些內容)是相當標準的功能,現在請 AI 寫,成本已經很低了。你不需要先變成工程師才能做這件事。

只是有三件事 AI 幫不了你,而這三件剛好是決定「會不會外流」的關鍵。

AI 幫不了 1決定要擋什麼

你得先把內容分堆,知道哪些要擋、擋誰、被看到會怎樣。AI 不知道哪份講義外流會影響你的收入,也不知道你跟哪個客戶簽了保密條款。

AI 幫不了 2要求做在伺服器端

你說「登入後才顯示講義」,AI 很可能給你一個在瀏覽器裡隱藏的版本,也就是第三層。畫面看起來一樣,實際上完全擋不住。你要明確講出「這個判斷要在伺服器端做,沒通過就不要把內容送出去」。

AI 幫不了 3驗收

程式跑得動,不代表擋得住。AI 不會主動告訴你它做的是第三層還是第五層,你要自己測。

兩個你自己就能做的驗收測試

不用懂程式,開個瀏覽器就能測。這兩題答對了,你才算真的做到第五層。

測試一登出後直接貼網址

先登入,複製講義頁的網址。然後完全登出(或另外開一個無痕視窗),把網址貼進去。

看得到內容就是沒擋住。正確的結果是看到登入頁,或是一個「請先登入」的提示,而且原始碼裡不該找得到講義內文。

測試二用沒買課的帳號貼網址

用一個已經登入、但沒有買這堂課的帳號,把同一個網址貼進去。

看得到內容就是只做了登入沒做授權。正確的結果是看到「你還沒購買這堂課」,而且一樣,原始碼裡不該有講義內文。

怎麼看原始碼在頁面上按右鍵選「檢視網頁原始碼」,或按 F12 打開開發者工具。用搜尋功能找講義裡的某一句話。找得到,就代表內容已經送到瀏覽器了,畫面上有沒有顯示不重要。這一招也是第三層為什麼不算數的原因。
所以誠實的說法是AI 把「寫出來」的成本降到很低,但「決定要擋什麼」跟「驗收有沒有真的擋住」仍然是你的工作。前者是這篇前半在講的內容分堆與六層判斷,後者就是上面那兩個測試。這兩件事做好了,AI 才是幫手。

這套方法保證什麼,不保證什麼

我要把邊界講清楚,因為這是誠信問題。

保證的技術做得到

1. 沒有身分的人拿不到完整講義。伺服器端判斷會在資料離開伺服器之前就擋下來。

2. 你可以撤銷單一個人的權限。改一列資料庫紀錄,那個人下次就進不去了。

3. 你有紀錄可以查。誰在什麼時候下載了什麼,可以留下來。

4. 檔案連結會過期。短效簽名網址轉傳出去之後,過一段時間就打不開。

不保證的技術做不到

已經授權的人,仍然可能截圖、錄影或轉傳。

一個人如果合法登入、合法看到了你的講義,他的眼睛看得到,他的螢幕就截得到;他的手機拍得到,他的鍵盤複製得到。市面上所有的防截圖、防右鍵、浮水印,都只能提高麻煩程度或事後追溯,沒有任何一種能真正阻止。

誠實的說法存取控制解決的是「沒授權的人拿不到」,解決不了「有授權的人拿去做別的事」。後者要靠的是使用規範、合約條款、浮水印帶來的追溯壓力,還有你跟學員之間的信任關係。

我建議的做法是兩件事一起做:技術上做到第五層與第六層,同時在課程頁與講義上明確寫出使用規範,讓學員知道什麼可以、什麼不可以。清楚告知本身就是一種保護,對雙方都是。

不要說百分之百防破解沒有這種東西,說了之後出事你會很難處理。

收尾 Recap

  1. 能不能被找到,跟找到之後能不能進去,是兩件事。noindex、robots.txt、隨機網址,只管前者。
  2. robots.txt 是公開檔案,把敏感路徑寫進去等於公布一份「這裡有東西」的清單。它不是保護機制。
  3. 隨機網址擋得住「被猜到」,擋不住「被轉傳」。網址發出去就收不回。
  4. 前端的顯示與隱藏是體驗設計。資料一旦送到瀏覽器,就當它已經公開。
  5. 六層由淺到深:公開展示間、從地圖抹除、拉紅線、有警衛的鐵門、大樓門禁加房間權限、房屋裡的保險箱。第三層是誤用示範,不是可以選的等級。
  6. 固定的少數人用門禁(Cloudflare Access),變動的多數人用自建會員系統。這兩種人不要用同一招。
  7. 第五層的關鍵字是伺服器端。同一句「擋起來」做在瀏覽器就是第三層,做在伺服器才是第五層。
  8. 頁面擋好了,檔案還是另一條路。講義 PDF 要走第六層的短效簽名網址。
  9. 寫程式可以請 AI,但決定要擋什麼跟驗收有沒有擋住,是你的工作。
  10. 已授權的人仍然可能截圖轉傳。技術做到第六層,剩下的靠使用規範與信任。

知道自己要哪一層之後,下一步是選平台。三家的免費額度、商用條款與價格在另一篇:網站放 GitHub、Vercel 還是 Cloudflare?三家免費額度、商用限制與功能差異

常見的坑

對策
以為加了 noindex 就等於鎖起來了noindex 只是請搜尋引擎不要收錄。任何人拿到網址照樣打得開
把敏感路徑寫進 robots.txt那是公開檔案,等於公布清單。改成真正的存取控制
用前端 JavaScript 判斷會員狀態開發者工具幾秒就繞過。判斷要放在伺服器端
只保護正式網域,忘了 pages.dev 或 vercel.app 預設網址所有備用入口、原始主機與 API 都要一起關
把一百位學員全丟進 Cloudflare Access席次會被佔滿而且不自動釋放,也沒有「誰買了哪一堂」的概念。改用自建會員系統
以為 Revoke 就釋放席次了Revoke 只終止連線階段,要 Remove 才釋放
頁面擋好了就以為安全講義 PDF 若放在固定公開網址,網址一被複製出去就結束了。改用短效簽名網址
叫 AI 寫完就上線,沒驗收做上面那兩個測試。登出後貼網址、用沒買課的帳號貼網址,兩題都對才算數
用半私密網頁裝付費講義那只是第二層,門是開著的。付費內容至少要第五層
跟客戶說百分之百防破解沒有這種東西。誠實說明邊界,寫清楚使用規範

給自己的定位提醒

這六層不是我發明的,它是把業界已經在用的做法排成一個順序,讓不寫程式的人也能判斷自己站在哪裡。真正做資安的人分得比這細很多,也嚴謹很多。我這份的用途是幫你做決定,不是拿來當資安規格書。

如果你的內容涉及個資、醫療、財務或合約,該找的是專業的人,不是這篇文章。

真正能帶走的那個判斷順序:先分堆,再問後果,再對照層級,最後才選技術。這個順序不會因為哪個工具改版而失效。
存取控制noindexrobots.txt會員系統Cloudflare Access網站安全

想繼續聊這個

我每個月固定辦兩場免費線上講座,分享 AI 應用與知識管理的實戰做法。如果你正在幫自己或客戶決定網站要放哪裡、怎麼分級,歡迎先從社群開始。

本篇所有價格與額度為 2026 年 8 月 19 日查證結果,皆為美元、未稅。平台方案隨時可能調整,重要決策前請重新核對官方頁面。

江江教練

隱性知識提煉師、AI 應用規劃師

加入 LINE 社群 →

看服務方案 →