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;
}
}
- 浏览器
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 对这项技术的客户端部分提供了内置的支持。