序言
以下内容为个人学习总结,不保证完全信息严谨可靠
背景
由于Http协议是无状态协议,也就是说当用户通过浏览器像服务器发送请求时,服务器无法判断用户身份,所以为了确定请求的合法性,浏览器请求时必须提交额外的数据,比如cookie等
产生的问题
为了窃取用户数据就产生了各种各样的非法请求,总的来说分为两类:
- 1.合法用户(受害者)提交非法请求(XSS跨站脚本攻击,点击劫持/UI覆盖攻击)
- 2.非法用户提交合法请求(CSRF跨站请求伪造)
XSS跨站脚本攻击
名称
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
分类
CSRF攻击
名称
CSRF(Cross-site request forgery),跨站请求伪造,也被称为one cliclk attack/session riding,缩写为:CSRF/XSRF
原理
攻击者盗用用户身份,以合法名义发送请求。
示意图
从上图可以看出,完成一次CSRF攻击,受害者必须依次完成两个步骤:
- 1.登录受信任的网站A,并在本地生成Cookie
- 2.在不登出A的情况下,访问危险网站B
Csrf攻击是源于WEB的隐式身份验证机制,WEB的身份验证机制虽然可以保证一个请求来自某个用户的浏览器,但却无法保证该请求是用户批准发送的。
CSRF的防御
主要从服务端和客户端两方面着手,从防御效果来看,服务端防御比较好
服务端CSRF防御
服务端的CSRF方式总的思想就是在客户端页面增加伪随机数
- Cookie Hashing(所有表单都包含同一个伪随机值)
- 在表单里增加Hash值,以认证是用户发送的请求
- 然后在服务器端进行Hash值验证
- 验证码
- 每次用户提交都需要在表单中填写一个图片上的随机字符串,这个完全可以解决CSRF
- One-Time Tokens(不同的表单包含不同的伪随机值)