Web服务和跨站请求伪造

时间:2013-11-07 12:29:46

标签: java web-services java-ee jax-rs csrf

我在如何防止针对JAX-RS网络服务的CSRF方面遇到了困难。

设置

REST-webservice为运行客户端的JavaScript MVC-Framework提供数据。框架将通过ajax-requests调用web服务。

所有用户都经过身份验证,并且使用@RolesAllowed注释保护了Web服务方法。这很好。

但该服务对跨站请求伪造是开放的。

解决方案

现在我理解了如何防止CSRF的概念。 Tomcat(我正在使用)有一个内置系统来阻止它,它可以使用过滤器。

的web.xml

 <filter>
   <filter-name>CsrfFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class>
    <init-param>
      <param-name>entryPoints</param-name>
      <param-value>/index.xhtml</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>CsrfFilter</filter-name>
    <url-pattern>/api/*</url-pattern>
  </filter-mapping>

现在,您可以使用HttpServletResponse#encodeRedirectURL(String)对所有网址进行编码,并以类似<form action="<%=urlActionBEncoded %>" method="POST">

的形式使用它们

问题

由于我没有使用jsp / jsf,这对我不起作用。所有请求都是通过ajax发出的,所以我必须在JavaScript代码中注入这些编码的URL。

问题

  • 我怎样才能在JavaScript中注入编码的URL?这会是一个 可能/合理的解决方案?
  • 我发现了其他一些防止CSRF的方法,但它们都涉及到了 JSF或JSP站点。还有其他可能的方法可以预防 Web服务中的CSRF?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

RESTful Web服务是无状态的,对每个请求执行基于非表单的客户端的身份验证。由于每次请求都有身份验证,因此应该没有问题(请参阅注释here)。但是,如果使用其他框架,则需要使用"Synchronizer Token Pattern"。您将生成的令牌传递给服务器验证的服务器。如果您没有使用表单来设置此令牌,那么我假设您需要读取使用哪个lib来安全地将其包含在从客户端到服务器的请求中。

“在JavaScript中注入编码的URL?”究竟是什么意思?你在谈论如何编码你的request params/query strings吗? Here是使用网址阻止CSRF的人。

我搜索时有一些有趣的链接:

http://docs.spring.io/spring-security/site/docs/3.2.x-SNAPSHOT/reference/springsecurity.html http://docs.spring.io/spring-security/site/docs/3.2.x-SNAPSHOT/reference/web-app-security.html https://code.google.com/p/csrf-filter/