Playwright 回應標頭拆分開放報告:代理瀏覽器測試應驗證 HTTP 日期

抽象 HTTP 回應標頭帶通過三個網際網路瀏覽器路由與代理時保持完整

Microsoft Playwright 儲存庫在 2026 年 9 月 12 日出現一條開放 Issue。報告指出,Firefox 與 WebKit 的 response.headersArray() 可能在逗號處拆分原本只有一個值的回應標頭。HTTP 日期本來就包含逗號,因此 DateLast-Modified 可能顯示成兩個項目,即使伺服器只傳送一行。報告也描述 macOS WebKit 處理含 Expires 日期之 Set-Cookie 的差異。

這仍是使用者提交的開放報告,不是維護者確認的缺陷或已發布修正。重現環境使用 Playwright 1.64.0-next、macOS arm64,並比較 Chromium、Firefox 和 WebKit。變更生產邏輯前必須在自己的版本重現。

內部研究來源:Microsoft Playwright 儲存庫,Issue 42687,《headersArray() splits single header values on commas on Firefox and WebKit, corrupting every HTTP-date header》,2026 年 9 月 12 日建立。

為何代理蒐集需要關注

瀏覽器自動化常用回應標頭判斷新鮮度、快取、簽章證據及工作階段。若一個標頭被拆成兩值,蒐集器可能解析無效日期、把新內容標成過期、重複記錄事件,或遺失 Cookie 到期屬性。

代理也可能轉送、正規化或附加標頭。沒有直連與來源端原始證據時,容易把客戶端轉換誤判為代理問題,或漏掉真正路由變化。

建立自有標頭夾具

在自有 HTTPS 端點傳回確定的 DateLast-ModifiedExpires、日期形式 Retry-After,再加入允許逗號清單的欄位,以及兩條獨立 Set-Cookie,其中一條包含 Expires

正文加入隨機挑戰與請求編號,並於來源端保存預期原始標頭對,便於和瀏覽器輸出比較。

執行跨瀏覽器路由矩陣

維度
瀏覽器Chromium、Firefox、WebKit
路徑直連、代理閘道 A、代理閘道 B
APIheadersArray、headerValue、allHeaders、來源端原始日誌
位址族已購買的 IPv4、IPv6
工作階段新建、固定、輪換

固定瀏覽器版本、Playwright 版本、目標、語系、時區及請求標頭。每格重複測試,不以單一瀏覽器輸出作唯一事實。

解析日期前先比較結構

記錄每個欄位的項目數、順序、不分大小寫名稱、完整值摘要及解析結果。單值 HTTP 日期必須保持一個語意值。不能把所有陣列項目一律用逗號接回,因為清單型及重複型標頭有不同規則。

  • 單值日期要保留完整日期;
  • 清單型欄位可含逗號分隔成員;
  • Set-Cookie 必須保留獨立 Cookie 行及 Expires 內逗號;
  • 未知欄位不可在沒有明確語法時猜測重建。

區分代理與客戶端轉換

依序比較來源端原始標頭與直連 Chromium、來源端與直連 Firefox/WebKit、同一瀏覽器直連與代理,以及獲准閘道擷取與瀏覽器輸出。

若直連 Firefox/WebKit 已與來源端不同,而線路回應未變,客戶端路徑是主要假設;若只有一個代理路由改變原始證據,再調查該路由。結論必須可重現。

保護快取與新鮮度判斷

不要保存由畸形標頭解析的時間。先確認完整 HTTP 日期可解析、在合理範圍並符合原始值摘要。來源端接收時間要另存,不可冒充伺服器 Date

Last-Modified 驅動條件請求,要確認下一次 If-Modified-Since 傳送完整值。只有星期或遺失逗號會使快取驗證失效。

保護 Cookie 與工作階段

Cookie 到期風險更高,損壞的 Expires 會改變工作階段壽命。比較瀏覽器 Cookie 儲存與原始 Set-Cookie,但不可記錄 Cookie 值;只保存名稱雜湊、到期、網域、路徑、安全旗標及解析結果。

結合TLS 信任設定檔隔離測試住宅代理工作階段固定性測試。標頭正確不代表出口間工作階段隔離。

正式修正前的臨時處理

關鍵中繼資料優先使用在目前執行環境已驗證能保留完整值的 API,並保留原始標頭或來源端對照。只對已知單值日期做窄範圍處理。按瀏覽器與版本建立回歸測試,正式版本通過後再移除相容程式碼。

不要接合任意標頭陣列、改寫第三方 Cookie 或降低驗證。看似合理但錯誤的中繼資料比拒絕不確定記錄更危險。

上線檢查清單

  • 明確標示報告仍開放且未確認;
  • 自有夾具有來源端原始標頭對;
  • 三瀏覽器皆完成直連及代理對照;
  • 單值日期保持一個語意值;
  • 清單欄位與 Set-Cookie 分開處理;
  • 快取驗證器傳送完整日期;
  • 日誌不含 Cookie 值;
  • 未知或畸形資料預設拒絕;
  • 每次測試保存瀏覽器版本;
  • 臨時方案有明確移除測試。

常見問題

這能證明代理修改標頭嗎?

不能。報告涉及 Playwright 表示路徑,必須比較直連、來源端原始證據和代理路徑後再歸因。

可以把所有重複值用逗號接合嗎?

不可以。不同欄位組合規則不同,Set-Cookie 需要特殊處理。只依明確語法重建。

回應正文會受影響嗎?

報告聚焦標頭表示,正文另用代理回應完整性測試驗證。

現在就該修改生產解析嗎?

只有在精確版本重現後才修改,並使用窄範圍、可回復且有回歸測試的方案。

合規說明

只測試自有或獲准系統與代理路由。最小化標頭留存,不洩露 Cookie 或憑據,遵守隱私、合約及平台要求。中繼資料驗證不得用於繞過存取控制。