共计 1944 个字符,预计需要花费 5 分钟才能阅读完成。
CSRF(Cross-site request forgery)跨站申请伪造,也被称为 ”One Click Attack”(一键攻打)或者 ”Session Riding”(会话管制),是一种对网站的歹意利用。与传统的 XSS 攻打(跨站脚本攻打)相比,CSRF 攻打更加难以防备,被认为更具危险性。CSRF 攻打能够在用户不知情的状况下,以用户的名义伪造申请发送给攻打页面,从而在用户未受权的状况下执行受到权限爱护的操作。
场景解说
例如,一个用户 Andy 登录银行站点服务器筹备进行转账操作。在 Andy 的用户信息有效期内,Andy 被诱导查看了一个黑客歹意网站。该网站获取了 Andy 登录后的浏览器与银行网站之间尚未过期的 Session 信息。因为 Andy 浏览器的 cookie 中含有 Andy 银行账户的认证信息,黑客能够以 Andy 的非法身份假装拜访 Andy 的银行账户,并进行非法操作。
CSRF 攻打的进攻策略
- 验证 HTTP Referer 字段:验证申请起源页面的 Referer 字段,确保申请来自同一站点,但该办法并不牢靠,因为 Referer 字段可能被伪造或者被浏览器禁用。
- 在申请地址中增加 Token 并验证:在每个页面中嵌入一个随机生成的 Token,并将其增加到申请地址的参数中,后端服务器在接管到申请时验证 Token 的有效性。
- 在 HTTP 头中自定义属性并验证:在每个申请中增加自定义的 HTTP 头属性,例如 ”X-Requested-With” 或 ”X-CSRF-Token”,后端服务器在接管到申请时验证该属性的值。
以 Spring Security 平安框架中的 CSRF 进攻性能来解说:
disable()
: 敞开 Spring Security 默认开启的 CSRF 进攻性能。csrfTokenRepository(CsrfTokenRepository csrfTokenRepository)
: 指定要应用的 CsrfTokenRepository(Token 令牌长久化仓库)。默认是由 LazyCsrfTokenRepository 包装的 HttpSessionCsrfTokenRepository。requireCsrfProtectionMatcher(RequestMatcher requireCsrfProtectionMatcher)
: 指定针对什么类型的申请利用 CSRF 防护性能。默认设置是疏忽 GET、HEAD、TRACE 和 OPTIONS 申请,而解决并进攻其余所有申请。
- CSRF 防护性能敞开的配置,但间接敞开 CSRF 进攻的形式简略粗犷,不太举荐应用,如果强行敞开后网站可能会面临 CSRF 攻打的危险,适宜在开发过程中测试应用。
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
// ... 其余配置
}
Spring Boot 整合 Spring Security 进行 CSRF 进攻的示例
-
针对 Form 表单数据批改申请的 CSRF Token 配置:
在表单中增加携带 CSRF Token 信息的暗藏域:<form method="post"> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> <!-- 其余表单字段 --> <input type="submit" value="Submit" /> </form>
- 针对 Ajax 数据批改申请的 CSRF Token 配置:
在页面的 <head>
标签中增加 <meta>
标签设置 CSRF Token 信息,并在具体的 Ajax 申请中获取相应的 Token 值,并将其增加到申请的 HTTP header 中进行验证。
<head>
<meta name="_csrf" th:content="${_csrf.token}"/>
<meta name="_csrf_header" th:content="${_csrf.headerName}"/>
<!-- 其余头信息 -->
</head>
<body>
<!-- 具体页面内容 -->
<script type="text/javascript">
$(document).ajaxSend(function(e, xhr, options) {xhr.setRequestHeader($("meta[name='_csrf_header']").attr("content"), $("meta[name='_csrf']").attr("content"));
});
// 其余 Ajax 申请
</script>
</body>
心愿通过以上的解说,能让大家更深刻的理解 CSRF(跨站申请伪造)攻打及进攻策略。
本文由 mdnice 多平台公布