阻止 CSRF 请求——SameSite 不工作

Prevent CSRF request -- SameSite not work

我在 tomcat 7.0.77 上使用 struts2 框架 运行。 在公共过滤器中,我使用以下代码添加了 SameSite cookie:

    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 和 单击 "Click me!"。

我期望的是,当我单击此 "Click me!" 时,link 将我重定向到 https://192.168.1.100/home.html,但不应传递 cookie。所以我需要重新登录。

但实际情况是我仍处于登录状态并且所有 cookie 都已通过,我可以从 Chrome 开发人员工具中看到这一点。

真的很困惑我哪里错了,感谢您的帮助!

终于花了一整天时间弄明白了。 我们需要将 SameSite 理解为一个选项而不是一个键。

所以我们需要像这样设置一个cookie:

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