A8 - 跨站点请求伪造
跨站点请求伪造是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法,简单说就是用户在浏览网站1.com的时候,里面含有一些恶意内容,在用户不知情的情况下访问了网站2.com,从而不知不觉的进行了一些恶意操作。
在网上找了张图片很能说明这个过程:
首先,用户正常访问某一服务器的网站,成功登陆系统,生成了会话cookie,并保持会话在有效状态;然后到了第4步的时候,用户通过邮件或者IM等方式,收到了具有恶意代码的攻击网址,当用户点击此攻击页面时,攻击者通过利用 html标签img,script,iframe等元素的src属性,使用户在不知情的情况下,发起对正常site的恶意访问,当点击完成后,也就是在图中第5步时,恶意代码已经执行完毕,攻击就发生且完成。
上面说过了攻击原理之后,我们来说说如何防止这种不知情情况下就发生的攻击呢?一般有如下几种方式:
1、使用cookie的httponly属性,httponly属性可以阻止客户端JavaScript脚本来读取用户的cookie信息,从而保证数据的安全性。
2、检查请求的Referer,Referer Check用来检验请求是否来自合法的源头,因为在互联网Web应用中,页面与页面之间都有一定的逻辑关系,使得每个正常请求都有一定的规律,一般是可以 通过HTTP请求的头部获取Referer信息,通过判断该值是可以识别出来有可能是CSRF请求。但是这样会使得编码相对复杂一些,同时,服务一并不一 定可以获取其值,有些用户或浏览器处于隐私保护或安全的目的,会禁用Referer信息得发送,所以这种方法是一种可行的方法,但并不是一种可以依赖的防 御CSRF的手段。
3、采用验证码,这是一种最简单而有效的防止CSRF的方法,因为验证码在请求完成的过程中,强制用户与应用进行了交互,而CSRF都是在用户不知情的情 况下完成的,所以很有效。但是验证码需要每个提交都要用户输入,增加了用户操作的复杂度,用户体验不好,一般只在登陆的时候使用比较好,所以这种方法只能 作为一种辅助手段,而不是主要手段。
4、使用Token,这是防止CSRF最有效也是最常用的方法,具体就是在用户登陆成功后,为该会话分配一个采用安全随机数(不可被预测)生成的值,保存 在session里面,称之为token。同时,在客户端的Web页面通过hidden元素将值写入里面。当客户端提交请求的时候,将此token随请求 一起提交,服务器端可以通过此提交的token来和session里存放的token来对比,通过对比结果来判断客户端的访问是否合法。这种方法也是当前 最广泛的方法。
5、尽量使用POST,放弃GET方法,CSRF攻击多数攻击代码都被隐藏在iframe,img等元素的src属性里,这样浏览器进行加载的时候,只会发起get操作,所以,如果我们的服务器端都改为POST的话,至少会降低被攻击的概率。
6、增加二次确认页面,在进行删除,更新的时候,不要直接进行数据操作,而是加入一些确认对话框之类的页面,让用户二次确认,即增加用户与服务端的交互行为。
关于这部分就说这么多吧~