CSRF 過濾器
跨站請求偽造 (CSRF) 是一種攻擊,當惡意的第三方網站利用漏洞,使其能夠代表使用者提交不需要的請求時就會發生。為了減輕此攻擊,此過濾器會檢查請求的來源,以確定請求的來源是否與其目的地相同。
為了幫助展示前端 Envoy 如何強制執行 CSRF 策略,我們正在發布一個 docker compose 沙箱,該沙箱會部署一個具有前端和後端的服務。此服務將在兩個具有不同來源的不同虛擬機器上啟動。
前端有一個欄位可以輸入您要傳送 POST 請求的遠端網域,以及選擇遠端網域的 CSRF 強制執行方式的單選按鈕。CSRF 強制執行的選項為
已停用:在請求的路由上停用 CSRF。由於沒有 CSRF 強制執行,因此會產生成功的請求。
陰影模式:不會在請求的路由上強制執行 CSRF,但會記錄請求是否包含有效的來源。
已啟用:啟用 CSRF,並且當請求來自不同的來源時,會傳回 403 (禁止) 狀態碼。
已忽略:啟用 CSRF,但請求類型為 GET。這應繞過 CSRF 過濾器並成功傳回。
步驟 1:啟動所有容器
變更到 examples/csrf/samesite
目錄,並啟動容器
$ pwd
envoy/examples/csrf/samesite
$ docker compose pull
$ docker compose up --build -d
$ docker compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------------------------------------
samesite_front-envoy_1 /docker-entrypoint.sh /bin ... Up 10000/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:8001->8001/tcp
samesite_service_1 python3 /code/service.py ... Up (healthy)
現在,切換到 csrf
範例中的 crosssite
目錄,並啟動容器
$ pwd
envoy/examples/csrf/crosssite
$ docker compose up --build -d
$ docker compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------------
crosssite_front-envoy_1 /bin/sh -c /usr/local/bin/ ... Up 10000/tcp, 0.0.0.0:8002->8000/tcp
crosssite_service_1 python3 /code/service.py ... Up (healthy)
步驟 2:測試 Envoy 的 CSRF 功能
您現在可以在 https://127.0.0.1:8002 開啟瀏覽器,以檢視您的 crosssite
前端服務。
輸入 samesite
機器的 IP 以示範跨站請求。啟用強制執行的請求將會失敗。預設情況下,此欄位會填入 localhost
。
若要示範同站請求,請在 https://127.0.0.1:8000 開啟 samesite
的前端服務,並輸入 samesite
機器的 IP 位址做為目的地。
跨站請求的結果將會顯示在 *請求結果* 底下的頁面上。您瀏覽器的 CSRF
強制執行記錄可以在瀏覽器主控台和網路索引標籤中找到。
例如
Failed to load resource: the server responded with a status of 403 (Forbidden)
如果您將目的地變更為與顯示網站的目的地相同,並將 CSRF
強制執行設定為已啟用,則請求將會成功執行。
步驟 3:透過管理介面檢查後端統計資料
當 Envoy 執行時,如果設定了連接埠,它可以接聽 admin
請求。在範例組態中,後端管理介面會繫結至連接埠 8001
。
如果您瀏覽到 https://127.0.0.1:8001/stats,您將能夠檢視後端的所有 Envoy 統計資料。當您從前端叢集發出請求時,您應該會看到無效和有效來源的 CORS 統計資料遞增。
http.ingress_http.csrf.missing_source_origin: 0
http.ingress_http.csrf.request_invalid: 1
http.ingress_http.csrf.request_valid: 0
另請參閱
- Envoy 管理快速入門指南
Envoy 管理介面的快速入門指南。