Springboot和Angular的CSRF防御

CSRF 是什么

跨站请求伪造

知乎解答搬运: csrf是什么.

Springboot CSRF

在spring boot中可以使用spring security的filter防止CSRF攻击。
通过 new CsrfFilter(new CookieCsrfTokenRepository())
new CsrfFilter(new HttpSessionCsrfTokenRepository())
可分别生成和验证存于Cookie和Session的XSRF-TOKEN。

  • 所需依赖:
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-web</artifactId>
</dependency>
  • 配置类
@Configuration
public class FilterConfiguration {
    
    @Bean
    public FilterRegistrationBean csrfFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new CsrfFilter(new HttpSessionCsrfTokenRepository()));
        registration.addUrlPatterns("/*");
        return registration;
    }
}
  • 浏览器

Springboot和Angular的CSRF防御

Angular CSRF

Angular对CSRF防御的支持是默认的。

Angular官方文档: cross-site-request-forgery.

在跨站请求伪造(XSRF 或 CSFR)中,攻击者欺骗用户,让他们访问一个假冒页面(例如 evil.com), 该页面带有恶意代码,秘密的向你的应用程序服务器发送恶意请求(例如 example-bank.com)。

假设用户已经在 example-bank.com 登录。用户打开一个邮件,点击里面的链接,在新页面中打开 evil.com。

该 evil.com 页面立刻发送恶意请求到 example-bank.com。这个请求可能是从用户账户转账到攻击者的账户。 与该请求一起,浏览器自动发出 example-bank.com 的 cookie。

如果 example-bank.com 服务器缺乏 XSRF 保护,就无法辨识请求是从应用程序发来的合法请求还是从 evil.com 来的假请求。

为了防止这种情况,你必须确保每个用户的请求都是从你自己的应用中发出的,而不是从另一个网站发出的。 客户端和服务器必须合作来抵挡这种攻击。

常见的反 XSRF 技术是服务器随机生成一个用户认证令牌到 cookie 中。 客户端代码获取这个 cookie,并用它为接下来所有的请求添加自定义请求页头。 服务器比较收到的 cookie 值与请求页头的值,如果它们不匹配,便拒绝请求。

这个技术之所以有效,是因为所有浏览器都实现了同源策略。只有设置 cookie 的网站的代码可以访问该站的 cookie,并为该站的请求设置自定义页头。 这就是说,只有你的应用程序可以获取这个 cookie 令牌和设置自定义页头。evil.com 的恶意代码不能。

Angular 的 HttpClient 对这项技术的客户端部分提供了内置的支持。

上一篇:第一个 Angular 应用程序


下一篇:Angular 自定义模板驱动表单验证指令