防止CSRF请求 - SameSite不起作用

时间:2017-08-03 03:46:41

标签: cookies csrf

我使用在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和  点击&#34;点击我!&#34;。

我期待的是,当我点击这个&#34;点击我!&#34;时,该链接会将我重定向到https://192.168.1.100/home.html,但不应该传递cookie。所以我需要再次登录。

但实际情况是我仍处于登录状态,所有Cookie都会通过,我可以从Chrome开发者工具中看到。

真的很困惑我错了,谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

最后花了一整天来搞清楚。 我们需要将SameSite理解为一个选项,而不是一个键。

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

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