是否有必要保护 JAX-RS 请求免受 CSRF 影响?
Posted
技术标签:
【中文标题】是否有必要保护 JAX-RS 请求免受 CSRF 影响?【英文标题】:Is it necessary to protect JAX-RS requests against CSRF? 【发布时间】:2016-01-17 15:09:34 【问题描述】:是否有必要保护 JAX-RS 请求免受 CSRF 的攻击?
definition REST 是无状态的,因此不存在会话 id(会话 cookie),因为根本没有会话(另请参阅 https://***.com/a/15746639/5277820)。
我的 Spring Security Java 配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig
@Configuration
@Order(1)
public static class JaxRsWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter
@Override
protected void configure(final HttpSecurity http) throws Exception
http
.antMatcher("/services/**")
.csrf().disable()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/services/**").permitAll()
.anyRequest().hasAuthority("ROLE_user")
.and()
.httpBasic()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
但我发现例如以下博客:Stateless Spring Security Part 1: Stateless CSRF protection。不幸的是,该博客没有解释为什么需要 CSRF 保护。
是否还有其他没有会话 cookie 的 CSRF 攻击?
【问题讨论】:
如果您的网站被 Web 浏览器使用,您只需要保护它们免受 CSRF 影响。如果只是说 curl 使用,那么你就不用担心 CSRF 【参考方案1】:CSRF 攻击不需要会话存在。 CSRF 攻击包括通过诱使用户点击链接或提交表单以访问用户登录的应用程序来代表用户做某事。
是否使用基本身份验证或会话 cookie 来识别用户是无关紧要的。
请注意,使用 cookie 并不意味着应用程序不是无状态的。 cookie,就像基本身份验证一样,只是在每个 HTTP 请求中发送一个附加标头。
【讨论】:
谢谢。对于Basic Authentication Scheme,我在RFC 2617 中找到了相关部分:“客户端应该假设所有路径都在请求URI 的路径字段中最后一个符号元素的深度或更深的深度内,也位于指定的保护空间内当前挑战的基本领域值。客户端可以抢先发送相应的授权标头以及对该空间中的资源的请求,而无需从服务器接收到另一个挑战。”【参考方案2】:访问令牌有时存储在(充其量仅安全的 http)cookie 中,因此客户端不必费心将其添加到每个请求中手动:cookie 会自动附加到请求中由浏览器。这就是需要实施 CSRF 保护的原因。
您链接的文章建议让客户端在 Cookie 和自定义 HTTP 标头中生成并发送相同的唯一秘密值,这非常聪明:
考虑到一个网站只允许为其读取/写入一个 Cookie 自己的域,只有真实站点可以在两者中发送相同的值 标题。
也就是说,如果您收到一封电子邮件,其中包含以 http://yourserver.com/admin/deleteAll
为目标的虚假图片(服务器通过 GET
... 处理它),则 唯一秘密 不会是在请求头中设置(旧的仍然可能存在于 cookie 中):服务器必须拒绝请求。
【讨论】:
我知道,cookie 会自动附加到浏览器的请求中,但我不知道授权标头也会由浏览器自动附加。最后一个确实是无状态(和无 cookie)JAX-RS 请求的问题。以上是关于是否有必要保护 JAX-RS 请求免受 CSRF 影响?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Security 保护 Web 应用程序免受 CSRF 攻击