简介
CSRF : Cross-Site Request Forgery
用户端与服务器端利用HTTP协议进行交互,并利用请求-响应的方式开展Web应用;在这个过程中,如果用户端发出的请求被伪造,那么会带来危险的后果,这就是请求伪造。
理解
攻击者盗用了你的身份,以你的名义进行某些非法操作
重点
CSRF的攻击建立在浏览器与Web服务器的会话中
欺骗用户访问url
CSRF和XSS
XSS:攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行
属于客户端攻击
侧重点不同
XSS:侧重于获取用户的权限及信息
CSRF:伪造特定用户的请求
攻击者伪造当前用户的行为,让目标服务器误以为请求由当前用户发起,并利用当前用户的权限实现业务请求伪造
CSRF漏洞利用场景(危害)
管理员用户
添加账号
删除某篇文章
……
个人用户
配合存储型XSS漏洞
以你的名义发送邮件,发信息,盗取你的账号,甚至购买商品
个人隐私泄露以及财产安全
CSRF防御思路
1、添加中间环节
添加验证过程
- 修改密码时,需要输入原密码
付款时的验证码
2、验证用户请求的合法性
1)验证referer
referer:本次请求的发起页面(告诉Web服务器,用户是从哪个页面找过来的)
2)利用token
- token必须为一次性
- token需有较强的随机性
3、设置验证码
4、限制请求方式只能为POST
令牌的功能
1、防止一个表单被重复提交
2、防御CSRF攻击(因为如果没有令牌,服务器无法识别当前请求是用户主动发出的,还是黑客伪造的)
思路:在表单页面中生成一个随机字符串作为令牌,放在隐藏域中,随表单一起提交,服务器收到表单后验证令牌是否有效,只有验证通过才能执行后面的操作。
令牌是一次性的,只要服务器验证了这个令牌,令牌就失效了。
项目中添加令牌验证功能的开发思路如下:
1、为所有涉及数据添加、修改和删除的操作添加令牌验证,而查询类操作不需要验证。
2、为了方便验证,查询操作统一使用GET方式,添加、修改和删除操作统一使用POST方式。
3、当收到POST方式的请求时,验证令牌是否有效;如果令牌无效,则不允许继续执行。
4、当页面打开时,PHP自动生成一个令牌,保存在Session中,用于下次验证。
5、对于普通的表单,使用PHP将令牌输出到隐藏域中,下次提交表单时会自动携带令牌。
6、对于Ajax请求,PHP需要先将令牌输出到HTML中,当页面打开后,使用JavaScript程序获取令牌,将令牌保存,然后在下次的Ajax请求中将令牌放在请求头中发送。PHP在验证令牌后,生成新的令牌,放在响应头中。最后使用JavaScript获取响应头中的令牌保存,用来在下次的Ajax请求中携带。
令牌的两种方式
- 基于一次性令牌的验证
会导致并发的Ajax请求出现问题,因此出现了 在一段时间内有效的令牌 - 在一段时间内有效的令牌验证
虽然降低了令牌的安全性,但只要保证令牌不被窃取,依然可以起到防御CSRF攻击的作用。