总结XSS与CSRF两种跨站攻击
XSS:跨站脚本(Cross-site scripting)
CSRF:跨站请求伪造(Cross-site request forgery)
XSS:脚本中的不速之客
XSS全称“跨站脚本”,是注入攻击的一种。其特点是不对服务器造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有JavaScript的内容文本。这时服务器端如果没有过滤或转移掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本。
XSS防御手段
原则: 不相信客户输入的数据
注意: 攻击代码不一定在<script></script>中
- 将重要的cookie标记为http only,这样的话JavaScript中的document.cookie语句就不能获取到cookie了。
- 只允许用户输入我们期望的数据。例如:年龄的textbox中,只允许用户输入数字。而数字之外的字符都过略掉。
- 对数据进行Html Encode处理
- 过滤或移除特殊的Html标签,例如:<script>,<iframe>,⁢for <, >for>, " for
- 过滤JavaScript事件的标签。例如 onclick= , onfocus等等。
CSRF:冒充用户之手
CSRF,中文是跨站点请求伪造。CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作,达到攻击目的。
CSRF攻击的本质原因
CSRF攻击是源于Web的隐式身份验证机制!Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。CSRF攻击的一般是由服务端解决的。
CSRF工具的防御手段
-
尽量使用POST,限制GET
GET接口太容易被拿来做CSRF攻击,当然POST并不是万无一失,攻击者只要构建一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性。 -
浏览器Cookie策略
拦截第三方本地Cookie(Thired-party Cookie)的发生。 -
加验证码
-
Referer Check
-
Anti CSRF Token
现在业界对CSRF的防御,一致的做法是使用一个Token(Anti CSRF Token)
例子:
- 用户访问某个表单页面。
- 服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。
- 在页面表单附带上Token参数。
- 用户提交请求后,服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。
这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构建一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。
注意:
CSRF的Token仅仅用于对抗CSRF攻击。当网站同时存在XSS漏洞时候,那这个方案也是空谈。所以XSS带来的问题,应该使用XSS的防御方案予以解决。