跨站请求伪造,Cross Site Request Forgery(CSRF):是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。
CSRF攻击
例子:用户是在icbc.com.cn进行正常的转账操作 我们想把资金转到Beauty.com
1.利用一个用户的会话cookie在浏览器没有关闭的时候,是不会被删除的。
在我们的Beauty.com中构造一个领奖页面,里边包含一个连接,让用户去点击
恭喜你获得了iPhone X一台,快来 <a href="www.icbc.com.cn/transfer?toBankId=账户名&money=金额">领取吧!</a>
我们得事先知道icbc.com.cn的转账操作的url和参数名称。如果这个用户恰好登录了icbc.com, 那他的cookie还在, 当他禁不住诱惑,点了这个链接后,一个转账操作就神不知鬼不觉的发生了
2.利用img标签用户不进行链接点击也能完成转账操作
<img src="www.icbc.com.cn/transfer?toAccountID=黑客三兄弟的账户&money=金额">
只要他打开了这个页面,不用点击任何东西,就会发生转账操作。
3.icbc.com.cn的转账操作需要form表单,是POST操作的情况
创建一个不可见的form,用户一访问就用JavaScript自动提交;
<form action="http://www.icbc.com.cn/transfer" method="POST">
<input type="text" name="toAccountId" value="账户"/>
<input type="text" name="money" value="金额"/>
</form>
减少CSRF攻击的方法
- 1.服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
- 2.使用验证码
- 用户在icbc.com.cn转账,显示转账的form,除了常用的字段之外,额外添加一个token ;这个token是icbc.com服务器端生成的,是一个随机的数字。
<form action="http://www.icbc.com.cn/transfer" method="POST">
<input type="hidden" name="token" value="daft12348899"/>
<input type="text" name="toAccountId" value="账户"/>
<input type="text" name="money" value="金额"/>
</form>
用户的转账数据发送的服务器端, icbc.com就会检查从浏览器发过来的数据中有没有token,并且这个token的值是不是和服务器端保存的相等,如果相等,就继续执行转账操作,如果不相等,那这次POST请求肯定是伪造的。
介绍下如何实现 token 加密
- 1.token加密主要是用来做客户端和服务端的用户信息校验
- 2.服务端生成随机数,用户登录会将随机数告知客户端,并自己在缓存空间保留一份,每次客户端发送token,
- 服务端会对比缓存空间是否有此token,来判断用户是否存在
- 3.当确定token存在,进行下一步校验…,最后通过token拿取客户端需要的信息
- 4.加密方法:JWT,AES,DES…或者直接随机字符串