Contents

簡單實作測試 SameSite 的規則(Lax,Strict,None)

因為測試 SameSite 需要用 https,要怎麼快速實作環境是一個重點。

實作環境

1
2
3
4
#window
docker run --rm -d -p 5001:80 -p 5002:80 -p 6001:443 -p 6002:443 --name my-apache-php-app -v %cd%:/var/www/html eboraas/apache-php
#linux
docker run --rm -d -p 5001:80 -p 5002:80 -p 6001:443 -p 6002:443 --name my-apache-php-app -v `pwd`:/var/www/html eboraas/apache-php
  • http://localhsot:5001
  • http://localhsot:5002
  • https://localhsot:6001
  • https://localhsot:6002

還可以看hosts
Windows 路徑在 C:\Windows\System32\drivers\etc
Linux 路徑在 /etc/

1
2
3
4
5
# Added by Docker Desktop
192.168.1.115 host.docker.internal
192.168.1.115 gateway.docker.internal
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal

Docker Desktop 都幫我加上 host.docker.internal了,所以就加減用了。

  • http://host.docker.internal:5001
  • http://host.docker.internal:5002
  • https://host.docker.internal:6001
  • https://host.docker.internal:6002

這樣不同 port 和多網域一次完成。注意這邊都連到同一個 container。所以session都是吃一樣,所以到正式環境會連到不同環境機器,這點可能需要考慮到。通常會用 redis 之類去解決,不過也不是每個公司都有這樣環境,所以也需要考慮,這邊就不討論了。

實作一個範例

SameSite 的 lax 需要用 https 才能存進去 client cookies。

  1. https://localhost:6001/setcookies.php 會寫一筆
  2. form.php 修改 method GET或 POST
  3. 進去 https://host.docker.internal:6001/form.php
  4. 查看執行結果

GET 會跑出cookies資料。
POST 會顯示空白頁面。

這有效防止 CORS 問題。

可以看這張圖測試。
https://i.imgur.com/ypsKPZL.png

Github: malagege/CookiesSameSiteDemo

心得

這麼簡單實作我們發現 Cookies 一些設定可以增加安全性,之前像我們後端做刪除文章功能,通常使用 POST,可能會說 GET 也能做到一樣的事情,但是 Lax 時候,就算從別的網站 Post 過來,使用者登入資訊 Cookies 不會加上到 Request 上面,可以預防這種事發生。

Info
這攻擊手法是CSRF。相關查詢可以Google或看這篇Chrome Cookie 政策調整與反思 | 魷型前端

雖然現在前後端分離,最近在看這個可能沒有什麼用處。但在全端系統上,如何做到跨網域不重新登入,我覺得這個是滿重要議題。但最近很流行 OAuth 登入,有獨立做 Oauth Server也許也應用不到,基於技術好奇,我還是研究一下。