CSRF(Cross-site request forgery)
跨站請求僞造,也被稱爲One Click Attack
或者Session Riding
,一般縮寫爲CSRF
或XSRF
,是一種對網站的惡意利用。儘管聽起來像跨站腳本(XSS
),但它與XSS
很是不一樣,XSS
利用站點內的信任用戶,而CSRF
則經過假裝成受信任用戶的請求來利用受信任的網站。與XSS
攻擊相比,CSRF
攻擊每每不大流行(所以對其進行防範的資源也至關稀少)和難以防範,因此被認爲比XSS
更具危險性。 CSRF
是一種依賴web瀏覽器的、被混淆過的代理人攻擊(deputy attack
)。javascript
<!-- 模板引擎 freemarker --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <!-- Security (只使用CSRF部分) --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> </dependency>
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } /** * 配置CSRF過濾器 * * @return {@link org.springframework.boot.web.servlet.FilterRegistrationBean} */ @Bean public FilterRegistrationBean<CsrfFilter> csrfFilter() { FilterRegistrationBean<CsrfFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new CsrfFilter(new HttpSessionCsrfTokenRepository())); registration.addUrlPatterns("/*"); registration.setName("csrfFilter"); return registration; } }
<input name="${(_csrf.parameterName)!}" value="${(_csrf.token)!}" type="hidden" />
xhr.setRequestHeader("${_csrf.headerName}", "${_csrf.token}");
jQuery.ajaxSetup({ "beforeSend": function (request) { request.setRequestHeader("${_csrf.headerName}", "${_csrf.token}"); } });