2017-05-26 145 views
3

我们正在用ASP.NET Core构建3个不同的应用程序MVC应用程序,API,SPA(不是Angular)。此应用程序中的所有操作仅适用于授权用户。这就是我们用IdentityServer保护他们的原因。不记名令牌和CSRF

我们使用cookie来存储不记名令牌的值。我知道cookie的价值会自动发送到服务器。但是,因为它应该作为授权头添加,所以不会由浏览器自动完成。

这是否减轻了CSRF攻击的可能性?或者CSRF仍然可以使用持票人令牌,我们是否还需要添加CSRF令牌?

回答

2

是的,你仍然需要CSRF令牌。

如果您的SPA或MVC应用程序将基于用户的GET或POST操作向您的API发送请求,则仍需要CSRF令牌。

说有人诱骗用户点击触发的动作在你的SPA,或者职位,以你的MVC应用程序的链接,该应用程序将愉快地遵守并发送存储在cookie中的请求头中承载的道理,就像当用户点击应用程序本身的链接时。

这就是CSRF的重点,攻击者提出一个请求,就好像用户在您的Web应用程序中调用了一个动作一样。

1

如果我理解您正确,MVC和SPA都使用Identity Server对用户进行身份验证,并将Cookie中的令牌存储在主要用于访问API的Cookie中。

一般来说,有两种情况在这里:

  1. 你的cookies HTTP only(在前端无法访问)。然后,您将cookie发送到MVC和SPA服务器端,以提取Cookie并将请求进一步发送到API。这种情况下,您像往常一样易受CSRF攻击,因为您确实有效地使用cookie进行身份验证,并且随后的令牌提取和针对API的承载身份验证仅基于自动cookie身份验证的结果发生。

  2. Cookies可以在前台访问。这种情况下,您可以使用Javascript读取它们,并向MVC和SPA服务器端发送经过身份验证的请求(用于传递给API)或直接发送给API,使所有后端忽略可能受损的Cookie内容。 这种情况下,你不容易受CSRF攻击(正如你指出承载认证头必须明确构造)。但是,您很容易受到XSS(cross site scripting)的攻击:任何通过数据验证/卫生安全漏洞或简单第三方依赖关系注入页面的代码都可以读取cookie并将其重新发送到任何服务器。这种情况非常类似于使用本地/会话存储,因此任何描述其漏洞的文章也适用于您的场景(例如here)。

所以,你必须采取CSRF或XSS之间的选择作为攻击主力。

CSRF可以完全防止反伪造令牌,但如果您未能做到这一点,攻击很容易组织。

由于您使用了大量的第三方库,XSS在理论上很难完全防止在现代开发中(另一个XSS攻击媒介 - 输入卫生并不是一个常见问题,因为大多数MVC框架都是这样做的对你来说默认like ASP NET Core)。但是,您有避免它的公平机会,在许多情况下,这种选择是合理的选择e.g. Auth0 recommends it

+0

关于#1:SPA通常与AJAX请求一起工作,他们无法访问HttpOnly cookie。 – CodeCaster

+1

这是正确的。这就是为什么我描述了两个案例(HttpOnly而不是)。我看到有几次cookies用作本地存储,只要问题提到了头文件验证,我怀疑它暗示了从cookies中提取令牌 – Igor

+0

我看到我误解了你。当cookie(带有令牌,大概是)与Ajax请求一起发送时,#1正好是普通cookie身份验证的情况。所以这里没有令牌提取和csrf漏洞。 – Igor