3

我在如何防止 CSRF 针对我的 JAX-RS Web 服务时遇到了困难。

设置

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

所有用户都经过身份验证,并且 Web 服务方法使用@RolesAllowed注释进行保护。这工作正常。

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

一个办法

现在我了解了如何防止 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>

现在您可以对所有 URL 进行编码 HttpServletResponse#encodeRedirectURL(String)并以这样的形式使用它们<form action="<%=urlActionBEncoded %>" method="POST">

问题

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

问题

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

提前致谢 :)

4

1 回答 1

1

RESTful Web 服务是无状态的,对每个请求都执行基于非表单的客户端的身份验证。那里应该没有问题,因为每个请求都需要进行身份验证(请参阅此处的评论)。但是,如果使用另一个框架,那么您想使用“同步器令牌模式”。您将生成的令牌传递给服务器验证的服务器。如果您不使用表单来设置此令牌,那么我假设您需要读取使用哪个库来安全地将其包含在从客户端到服务器的请求中。

“在 JavaScript 中注入编码的 URL”到底是什么意思?您是在谈论如何编码您的请求参数/查询字符串吗? 是有人使用 URL 来阻止 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/

于 2013-11-08T06:46:47.040 回答