我在如何防止 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?
提前致谢 :)