Community程式設計與開發github.com

davidgin/web-bot-auth

在網頁伺服器、API、邊緣工作者或中介軟體中加入 Web Bot Auth 驗證(HTTP 訊息簽章,RFC 9421,Ed25519),讓已簽章的 AI 代理程式與機器人可被識別,並拒絕偽造或重播的簽章。

web-bot-auth 是什麼?

這個技能為現有服務加入對已簽章代理程式流量的驗證。其核心難點不在密碼學,而在於處理那些讓簽章看似有效卻可能被繞過的微小細節:未簽署的元件、重複使用的 nonce、會觸發 fetch 的標頭、以及與客戶端簽署不同的 URL 重建方式。本技能提供參考程式碼與測試案例來處理這些細節,開發者的工作則是將它們整合到使用者的技術棧中,且不削弱安全性。它支援 Python(可複製 `web_bot_auth.py`)並提供語言中立的測試向量以移植到其他語言。運作時,它會重構請求物件、驗證簽章、檢查 replay、並對應至不同結果(如 `verified`、`invalid`、`replay`、`expired`),再依預設動作處理(如封鎖或記錄)。技能也強制執行安全規則:不內聯擷取未允許清單的目錄、使用倉儲級原子 nonce 儲存、僅在簽章驗證成功後記錄 nonce,且正確處理代理後方的 URL 重建。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/davidgin/web-bot-auth-skill/tree/HEAD/web-bot-auth

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Web Bot Auth 驗證

此技能為現有服務加入已簽章代理程式流量的驗證。困難的部分不在密碼學,而在於那些讓簽章看起來比實際更無意義的微小細節:未簽署的元件、重複使用的 nonce、會觸發 fetch 的標頭、與客戶端簽署不同的 URL 重建方式。這裡的參考程式碼與測試已將這些細節編碼。你的工作是將它們整合到使用者的技術棧中,且不削弱安全性。

規範狀態:目標為 draft-meunier-web-bot-auth-architecture-05(IETF 網際網路草案,非標準)並接受許多已部署代理程式仍會傳送的舊版 quoted-string Signature-Agent。告知使用者這是草案,可能會有變更。

工作流程

  1. 找到請求進入點。 辨識框架以及請求進入的位置(中介軟體、邊緣處理器、反向代理鉤子)。注意服務是否位於代理或 CDN 後方,因為這決定了如何重建 URL(請參閱 references/adapters.md)。

  2. 與使用者確定政策決策。 閱讀 references/policy-decisions.md,並詢問對話中尚未確定的任何事項:允許哪些運算子、是否要求請求綁定與 nonce、nonce 儲存方式,以及每種結果應採取的行動。不要默默選擇嚴格的設定:嚴格的預設值會拒絕大多數現今已部署的代理程式。也不要默默選擇寬鬆的設定:說明它們留下了哪些漏洞。

  3. 加入驗證器。

    • Python:將 scripts/web_bot_auth.py 不變地複製到專案中(保留其授權標頭),將 cryptography 加入相依性,並撰寫一個建構 Request 的小型轉接器。
    • 其他語言:移植 scripts/web_bot_auth.py,使用該語言已建立的 Ed25519 函式庫(絕不自行實作)以及維護中的 RFC 8941 結構化欄位解析器(如果有的話)。移植尚未完成,直到每個 assets/test-vectors.json 中的案例都通過為止。
  4. 謹慎撰寫轉接器。 這是大多數整合出問題的地方。Request 必須攜帶發送時的方法、客戶端要求的絕對 URL、每個標頭出現的順序,以及解析或解壓縮前的原始 body 位元組。請參閱 references/adapters.md 中各框架的注意事項。

  5. 選擇 nonce 儲存。 僅限單一程序使用記憶體內儲存。任何具有兩個以上工作者或節點的系統都需要一個共享、強一致性的儲存。請參閱 references/nonce-stores.md。

  6. 將結果對應至行動。 除非使用者另有決定,否則使用下方的表格。

  7. 端到端測試整合。 透過真實框架(其測試客戶端)撰寫測試,使用 sign_request 產生已簽署的請求:一個有效請求、一個竄改 body 的請求、一個重播請求,以及一個過期請求。如果已複製檔案,也執行 scripts/test_web_bot_auth.py。

  8. 建議僅記錄的部署。 在強制執行任何動作之前,先記錄每個請求的 outcome、reason、operator、keyid、binds_request 和 replay_protected 一段時間。

結果

結果意義預設動作
unsigned無 web-bot-auth 簽章現有機器人處理 / 風險評分
verified有效簽章,允許清單中的運算子以該代理程式的身份接受;仍套用個別使用者驗證與速率限制
signed_untrusted有效簽章,已知但不在允許清單中的運算子視為未簽署,可選擇性地給予較低風險
unknown_operator格式正確,但無可用金鑰視為未簽署;可選擇性地排程背景目錄擷取
invalid存在但錯誤封鎖。合法的客戶端不會發送損毀的簽章
expired超出時間視窗封鎖
replayNonce 已使用過封鎖

Result.hostile 對最後三項為真。對於 verified,也檢查兩個旗標。如果 binds_request 為 false,則簽章不涵蓋方法、路徑、查詢與 body。如果 replay_protected 為 false,則表示沒有 nonce 或儲存不可用。合理的預設是對安全方法(GET、HEAD)接受任一旗標為 false 的已驗證請求。

容易違反的規則

這些規則存在是因為每個背後都有具體的攻擊。如果使用者的限制似乎需要違反其中一條,請解釋風險並讓他們決定。

  • 絕對不要為不在允許清單中的運算子內聯擷取金鑰目錄。 Signature-Agent 是攻擊者可控制的,因此擷取它指定的任何內容屬於 SSRF,並且會讓任何攻擊者癱瘓你的請求路徑。在背景工作中使用 safe_fetch_directory 擷取未知的運算子,或根本不擷取。
  • 每當 Content-Digest 被涵蓋時,請驗證它是否與 body 相符。 簽署標頭而無人檢查它是否與接收到的位元組相符是沒有意義的。
  • 僅在簽章驗證成功後才記錄 nonce。 否則任何人都可以填滿儲存,或預先消耗合法代理程式的 nonce。
  • 跨實例使用共享、原子的 nonce 儲存。 每個程序的快取會讓重播落在不同的工作者上。
  • 以 created 而非僅 expires 來限制新鮮度。 代理程式可能簽署具有長效期的簽章;無論如何,Policy.max_age 會保持重播視窗與 nonce 快取較小。
  • 重建客戶端實際請求的 URL。 在代理後方,僅使用來自你信任的代理的轉發協定與主機。如果出錯,有效簽章將無法驗證,或偽造的 Host 標頭將被信任。
  • 已驗證的簽章識別運算子,而非使用者。 在其後保留正常的驗證、個別使用者的授權與速率限制。絕對不要讓簽章代表使用者對敏感動作的同意。
  • 不要對已驗證的代理程式套用人類行為檢查。 它們本質上就是自動化。

檔案

  • scripts/web_bot_auth.py:驗證器、金鑰解析器、nonce 儲存與 sign_request。單一檔案;僅依賴 cryptography。
  • scripts/test_web_bot_auth.py:攻擊案例測試加上 RFC 9421 附錄 B.2.6 的符合性向量。從 scripts/ 目錄使用 python -m unittest -v test_web_bot_auth 執行。
  • scripts/generate_vectors.py:重新產生 assets/test-vectors.json。
  • assets/test-vectors.json:適用於移植的語言中立向量(僅測試金鑰)。
  • references/policy-decisions.md:需要與使用者一起做出的選擇及其權衡。請在步驟 2 中閱讀。
  • references/adapters.md:如何在常見框架及代理後方正確建構 Request。請在步驟 4 中閱讀。
  • references/nonce-stores.md:哪些儲存是安全的以及如何調整其大小。請在步驟 5 中閱讀。

相關技能