我在如何防止针对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。
问题
提前致谢:)
答案 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/