CSRF算是比较简单的Web攻击方式了吧,我们来看看它到底是什么。
CSRF(Cross-site request forgery)学名叫跨站请求伪造。从名字上可看出来,跨站,至少涉及两个站点。
CSRF的流程是这样的:
浏览器访问某站时,会携带该站保存在本地的cookie去请求该站的服务器。
比如访问A站,就会携带A的cookie去请求A站的服务器。访问A站时,不会携带另一个站点的cookie信息。
而CSRF攻击就是利用了这点,访问B站时,B站在用户不知情的情况下悄悄访问了A,这时就携带了A站的cookie,
A站检查cookie中的登陆凭证,认为正确,结果恶意操作就被当成正确操作执行了。
举个例子:
www.A.com站在用户登录后,会将登陆凭证保存在本地cookie中,A站有个删除个人信息的操作www.A.com/user/,
但需要一个参数:type(type=delete表示删除个人信息,type=modify表示修改个人信息等)。
用户登录A站之后又访问了B站(恶意网站),B站中有这样一段代码:
<form action=www.A.com/user/ method=POST>
<input type="text" name="type" value="delete" />
</form>
<script> document.forms[0].submit(); </script>
用户访问了B结果B站悄悄向A提交了删除信息的操作(访问A会携带A的cookie),这样就是CSRF攻击了。
防范的方法有许多,Token方式是最主流的。
CSRF能攻击成功,根本原因是:操作所带的参数均被攻击者猜测到了。
根据这个原因,我们就可以添加一个Token参数,其值是随机的,使攻击者不知道无法猜到。
通过Token方式防范CSRF,实施起来可以有两种方式吧,一是通过session,二是通过cookie。
服务端生成token,并保存在session中,然后拍给前端,放到hiddin域里。 下次请求时就会把token提交到服务端,服务端从session中取出token和hiddin域提交过来的token对比。
服务端生成token,拍给前端放到hiddin域里,然后经过加密把密文放在cookie里。 下次请求时会把hiddin域中的token和cookie里的加密token都提交给服务器,服务器得到cookie里的加密token进行解密, 然后跟hiddin域提交过来的token进行对比。
验证码不仅可用来防止暴力破解,还可以有效防止CSRF的攻击。 但问题在于,不可能在用户的所有操作上都需要输入验证码。只有一些关键的操作,才能要求输入验证码。
当浏览器向web服务器发出请求的时候,在HTTP的请求头(Request Headers)中一般会带上Referer,告诉服务器用户从哪个站点链接过来的。 服务器通过判断请求头中的referer,也能避免CSRF的攻击。