Web services 当启用内容类型协商时,JAXRS restful服务是否容易受到CSRF攻击?
我有一个RESTful API,它有@Consumes(MediaType.JSON)之类的注释——在这种情况下,在这样的服务上还可能发生CSRF攻击吗?我一直在修补服务器端使用CSRFGuard保护我的服务的安全,或者从客户端进行双重提交。然而,当我尝试使用带有enctype=“text/plain”的表单发布请求时,它没有起作用。如果在我的consumes注释中编码了MediaType.APPLICATION\u FORM\u Url,则说明该技术是有效的。当我使用POST/PUT/DELETE动词时,内容协商很有用,但是GET仍然可以访问,这可能需要研究 任何建议或输入将是伟大的,也请让我知道,如果你需要更多的信息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
CheersJAX-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来说,这是一个问题吗?是的,在两种情况下:
- 攻击者让用户提交带有
:Url编码内容的表单不是问题,因为结果不能是有效的JSON<如果您的服务器将内容解释为JSON而不是纯文本,则代码>文本/纯文本是一个问题。如果您的资源使用enctype=text/plain
进行注释,则不会出现问题,因为它不会接受@Consumes(MediaType.JSON)
,并且应该返回状态text/plain
。(请注意,JSON有一天可能会成为有效的enctype,这将不再有效)415
- 攻击者让用户提交AJAX请求:同一来源策略阻止向其他域发送AJAX请求,因此只要您不使用CORS头禁用此保护,例如
访问控制允许来源: