Web services 当启用内容类型协商时,JAXRS restful服务是否容易受到CSRF攻击?

Web services 当启用内容类型协商时,JAXRS restful服务是否容易受到CSRF攻击?,web-services,rest,jax-rs,csrf,Web Services,Rest,Jax Rs,Csrf,我有一个RESTful API,它有@Consumes(MediaType.JSON)之类的注释——在这种情况下,在这样的服务上还可能发生CSRF攻击吗?我一直在修补服务器端使用CSRFGuard保护我的服务的安全,或者从客户端进行双重提交。然而,当我尝试使用带有enctype=“text/plain”的表单发布请求时,它没有起作用。如果在我的consumes注释中编码了MediaType.APPLICATION\u FORM\u Url,则说明该技术是有效的。当我使用POST/PUT/DELE

我有一个RESTful API,它有@Consumes(MediaType.JSON)之类的注释——在这种情况下,在这样的服务上还可能发生CSRF攻击吗?我一直在修补服务器端使用CSRFGuard保护我的服务的安全,或者从客户端进行双重提交。然而,当我尝试使用带有enctype=“text/plain”的表单发布请求时,它没有起作用。如果在我的consumes注释中编码了MediaType.APPLICATION\u FORM\u Url,则说明该技术是有效的。当我使用POST/PUT/DELETE动词时,内容协商很有用,但是GET仍然可以访问,这可能需要研究

任何建议或输入将是伟大的,也请让我知道,如果你需要更多的信息


Cheers

JAX-RS旨在创建RESTAPI,该API应该是无状态的。 跨站点请求伪造不是无状态应用程序的问题

跨站点请求伪造的工作方式是,有人可能会欺骗您单击某个链接或在浏览器中打开一个链接,从而将您指向您登录的站点,例如某个在线论坛。由于您已登录该论坛,攻击者可以构建url,例如:someforum.com/deletethread?id=23454

该论坛程序设计糟糕,将根据会话cookie识别您,并确认您有能力删除该线程,并且实际上将删除该线程

所有这些都是因为程序基于会话cookie(甚至基于“记住我”cookie)对您进行身份验证

使用RESTful API时,没有cookie,请求之间没有状态维护,因此不需要防止会话劫持

通常使用RESTFul api进行身份验证的方法是发送一些额外的头。如果有人欺骗您点击指向restful API的url,浏览器将不会发送额外的标题,因此没有风险


简言之,如果REST API的设计方式是无状态的,那么就没有跨站点伪造的风险,也不需要CSRF保护。

添加另一个答案,作为Dmitri的答案混合服务器端状态和cookie

如果服务器通过多个请求在内存中存储用户信息,则应用程序不是无状态的。这会降低水平可伸缩性,因为您需要为每个请求找到“正确”的服务器

Cookie只是一种特殊的HTTP头。它们通常用于标识用户会话,但并非每个cookie都表示服务器端状态。服务器也可以在不启动会话的情况下使用cookie中的信息。另一方面,使用其他HTTP头并不一定意味着应用程序自动无状态。如果您将用户数据存储在服务器的内存中,则不会。 Cookie和其他标题的区别在于浏览器处理它们的方式。对我们来说,最重要的是浏览器将在每次后续请求时重新发送它们。如果有人欺骗用户提出他不想提出的请求,这是有问题的

对于使用JSON的API来说,这是一个问题吗?是的,在两种情况下:

  • 攻击者让用户提交带有
    enctype=text/plain
    :Url编码内容的表单不是问题,因为结果不能是有效的JSON<如果您的服务器将内容解释为JSON而不是纯文本,则代码>文本/纯文本是一个问题。如果您的资源使用
    @Consumes(MediaType.JSON)
    进行注释,则不会出现问题,因为它不会接受
    text/plain
    ,并且应该返回状态
    415
    。(请注意,JSON有一天可能会成为有效的enctype,这将不再有效)
  • 攻击者让用户提交AJAX请求:同一来源策略阻止向其他域发送AJAX请求,因此只要您不使用CORS头禁用此保护,例如
    访问控制允许来源:

有趣的是,没有人对此有意见。。。还是我的问题不那么清楚?hmmm您的RESTful API可以位于安全框架的后面,比如spring security,这意味着您需要通过该框架进行身份验证。在这种情况下,它会写入一个cookie,将您标识为经过身份验证的用户。一旦识别出用户,就可以使用获取/发布/删除/放置数据的常规服务调用。因此,在本例中,服务本身不是无状态的,但是服务位于具有状态的安全框架之后。无论如何,我的主要兴趣是检查当内容类型协商启用时是否有人能够执行CSRF攻击,因为我无法破解它。这将是一个糟糕的设计。API客户端可能是某个应用程序,而不是浏览器,根本不希望收到cookie。在RESTAPI中使用cookie是一种非常糟糕的做法。当然,现在我们的API使用基本和基于表单的身份验证进行保护。因此,其他一些不是浏览器的应用程序通过基本身份验证,它通过HTTPS在每个请求上发送用户名和安全令牌。这些用户是由系统生成的,他们可以访问部分API。然而,在基于浏览器的应用程序中,我必须使用基于表单的身份验证对用户进行身份验证。如果在第一次检查后会话中保留了主体请求,则可以避免通过拖网搜索用户来获取每个请求的主体。