Spring 对于只使用JSON的后端REST应用程序,CSRF是必需的吗?

Spring 对于只使用JSON的后端REST应用程序,CSRF是必需的吗?,spring,rest,security,csrf,Spring,Rest,Security,Csrf,许多资源声称()() 对于RESTful web服务公开的资源,确保任何PUT、POST和DELETE请求都受到跨站点请求伪造的保护是很重要的 CSRF对所有应用程序都是强制性的,对网络安全的关注程度最低 但是,你可以说: 对正常用户可以通过浏览器处理的任何请求使用CSRF保护。如果您只创建非浏览器客户端使用的服务,您可能希望禁用CSRF保护 那么,对一个应用程序禁用CSRF可以吗 仅公开RESTAPI 仅使用JSON(检查请求内容类型标头) 这取决于API的客户端。CSRF攻击基于这样一个事

许多资源声称()()

对于RESTful web服务公开的资源,确保任何PUT、POST和DELETE请求都受到跨站点请求伪造的保护是很重要的

CSRF对所有应用程序都是强制性的,对网络安全的关注程度最低

但是,你可以说:

对正常用户可以通过浏览器处理的任何请求使用CSRF保护。如果您只创建非浏览器客户端使用的服务,您可能希望禁用CSRF保护

那么,对一个应用程序禁用CSRF可以吗

  • 仅公开RESTAPI
  • 仅使用JSON(检查请求内容类型标头)

这取决于API的客户端。CSRF攻击基于这样一个事实,即客户端通过HTTP请求自动发送请求URL的cookie(授权)。如果您的客户端没有这样做(通常浏览器会自动这样做),您应该可以

原因是:如果您的API使用者未通过Cookie(浏览器自动存储的Cookie)在您的应用程序中进行身份验证/授权,则攻击者无法使用任何其他网页进行成功的CSRF攻击(使用浏览器中的API Cookie从其他网页发送HTTP请求)


换句话说,我无法想象API客户端的编写方式会使它能够向您的API发送请求,存储cookie(您的身份验证),还可以以某种方式向您显示一些“愚蠢”用户交互的内容—通过cookie向您的API发送请求(您的身份验证)来自以前的API请求。

很容易解释这一点:


CSRF令牌是基于Http会话生成的。如果您的API持有http会话,您当然希望使用CSRF令牌来保护它,但大多数REST服务都是无状态的,在这种情况下,您不能/不应该/不会使用CSRF令牌。

那么,应用程序做什么呢?如果它接受的json类似于
{“command”:“nuke the universe”}
,您可能需要对其进行一点保护,以确保隔壁的snotnosed小scriptkiddy不能发出该命令……它不提供HTML服务,只使用json这一事实并不重要。重要的是:针对REST服务的请求是否应该来自浏览器客户端。@JBNizet它们来自浏览器中运行的Javascript,而不是来自提交HTML表单,因为无法提交内容类型为application/json的表单。不确定这是否正确。您想如何在不使用浏览器(或自动发送cookie的客户端)的情况下攻击HTTP会话(如使用承载令牌)之类的API?
但大多数REST服务被设计为无状态的
这是不正确的,大多数情况下,我们需要HTTP会话来确定哪个用户发出请求,以及您的服务是否易受CSRF攻击,攻击者可以发出请求而不是真正的用户(通常发生在浏览器端)Rest API应该是无状态的,每个请求都会发送识别加密jwt令牌的会话来重新建立它。在这种情况下,不需要csrf,因为攻击者无法利用自动发送会话识别信息的用户代理。如果您的rest API设置了与会话相关的任何类型的cookie,可以帮助应用程序将其与会话关联,那么您需要csrf,因为浏览器将自动发送cookie。。。当涉及到剥削时,这确实很重要。在浏览器中发送应用程序/json请求的唯一方法是使用Javascript,但是同源策略阻止JS向不同来源的主机发出请求,并切换到使用CORS,CORS向我的REST发出飞行前请求,然后我的REST可以拒绝。你是指内容类型吗?部分但总体而言,我不明白如果没有类似浏览器的客户端,如何成功进行CSRF攻击——换句话说,存储cookie(授权您)并可以向API和任何恶意网页(重新获取API请求的cookie)发出请求。在CSRF攻击中不必涉及cookie。我使用HTTP Basic auth(让我们假设)登录mybank.com,在有的地方输入evil.com,然后单击evil.com上的Submit(提交)。尽管没有涉及Cookie,但它仍然是CSRF攻击。我编写了Cookie(您的身份验证),HTTP Basic是标题的特例,其工作方式与浏览器中的Cookie类似(它通过浏览器自动添加到HTTP请求中)…读“换句话说”部分…是。但是,如果您的API端点依赖cookie或某种机制来重新建立会话,那么什么是重要的。如果您没有使用cookie并使用客户端无法轻松构造或浏览器无法自动发送的身份验证令牌,则不需要csrf。因为没有识别旧会话的机制在纯无状态RESTAPI上,在这种情况下可以禁用csrf