一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
CSRF(跨站请求伪造),攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。 CSRF 攻击主要是因为Web的身份验证机制虽然可以保证一个请求是来自某个用户的浏览器,但是无法保证该请求是用户批准发送的
CSRF的特点
- 攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。
- 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。
- 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
CSRF 攻击过程:
1、登录受信网站A,并在本地生成Cookie
2、在不退出A的情况下,访问危险网站B
防御方法
首先先筛选需要防范CSRF的页面,然后确认是正规用户自愿发起的请求,限定修改只能使用POST请求,GET用在查看、展示等不需要改变资源属性的时候,但是攻击者可以模拟POST请求,所以在非GET请求可进行以下操作:
1、验证Referer字段 因为CSRF大多来自第三方网站,那么我们就直接禁止外域(或者不受信任的域名)对我们发起请求。可通过 Referer 字段确定来源
Referer :http 头的一个字段,记录当前一次请求的来源地址
验证当前请求必须从某个网页过来,否则直接拒绝
2、添加Token验证
因为 CSRF 攻击者无法直接窃取到用户的信息和登录凭证,仅仅是冒充,那么我们可以要求所有的用户请求都携带一个CSRF攻击者无法获取到的Token,并且该信息不存在于 cookie 之中。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,也可以防范CSRF的攻击。
用户打开页面的时候,服务器通过加密算法给这个用户生成一个Token,Token不能再放在Cookie中了,否则又会被攻击者冒用,可以保存在session中,页面提交的请求携带这个Token,服务器验证Token是否正确。
3、二次验证
在关键操作之前提供当前用户的密码或验证码,但是对用户体验不好