2017-08-03 111 views
0

我使用在tomcat 7.0.77上運行的struts2框架。 在通用過濾器,我已經添加SameSite餅乾與下面的代碼:防止CSRF請求 - SameSite不起作用

Cookie cookie = new Cookie("SameSite", "strict"); 
    cookie.setMaxAge(-1); 
    res.addCookie(cookie); 

我使用的是最新版本的Chrome(版本60.0.3112.90(正式版本)(64位))的測試,如果它可以避免CSRF。

假設要保護的服務器是192.168.1.100。與其他服務器上運行192.168.1.101,有一個非常簡單的test.html:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width= 
    , initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Document</title> 
</head> 
<body> 
    <a href="https://192.168.1.100/home.html">Click me!</a> 
</body> 
</html> 

於是,我打開Chrome標籤和登錄192.168.1.100。

然後我打開另一個Chrome標籤訪問https://192.168.1.101/test.html和 點擊「點擊我!」。

我期待的是,當我點擊這個「點擊我!」時,鏈接將我重定向到https://192.168.1.100/home.html,但不應該傳遞cookie。所以我需要再次登錄。

但實際情況是我仍然處於登錄狀態,並且所有cookie都已通過,我可以從Chrome開發人員工具中看到。

真的很困惑,我錯了,感謝你的幫助!

回答

0

終於花了一整天的時間弄清楚。 我們需要了解SameSite作爲選項而不是密鑰。

所以我們需要設置這樣一個cookie:

Cookie cookie = new Cookie("SomeKey", "SomeValue; SameSite=strict"); 
cookie.setMaxAge(-1); 
res.addCookie(cookie);