Web-CSRF

简介

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攻击的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值