XSS(跨站点脚本攻击)漏洞
攻击原理
攻击者向有xss漏洞的网站中传入恶意的html代码,其他用户浏览该网站时,这段html代码会自动执行,从而达到攻击的目的。XSS分类
(1)反射型XSS:被动的非持久性XSS—恶意数据紧跟请求立即返回浏览器,当用户点击URL带攻击代码的连接(通过多网址服务将之缩短),服务器解析后响应,再返回的响应内容中隐藏和嵌入攻击者的XSS代码,被浏览器执行,从而攻击用户。
(2)持久性(存储性)XSS:主动提交恶意数据(HTML/JS)到服务器存入数据库,攻击者在数据中嵌入代码,因此当其他用户请求后,服务器将数据返回给用户,用户浏览此页面时可能就收到了攻击。
- 恶意用户的HTML/JS输入服务器 -> 进入数据库 -> 服务器响应查询数据库 -> 用户浏览器;
(3)Dom-based XSS:从document.location/document.URL/document.referrer获取数据在本地执行;
- 防范
(1)使用XSS filter
- 输入过滤:对用户提交的数据进行有效性验证,阻止或忽略非期望格式的内容提交;
-
输出转义:输出HTML属性时使用HTMLEncode进行处理,输出到<script>中,可以进行JS编码;
(2)使用HttpOnly Cookie:浏览器向web服务器发起请求时会带上cookie字段,但是在js脚本中却不能访问cookie,避免xss攻击利用js的document.cookie获取cookie;
csrf(跨站请求伪造)攻击
- 攻击原理
源于web的隐式身份验证机制(可以保证一个请求来自某个用户的浏览器,但无法保证该请求是用户批准主动发送的); - 攻击条件
(1)客户端必须先登陆目标网站A,并在本地生成cookie;
(2)在不退出网站A的情况下,客户端访问危险网站B,危险网站B伪造网站A的url请求,让该请求从客户端的浏览器并携带网站A的cookie发出去(session并没有过期); - 防范
(1)验证Http Referer字段:Referer字段记录了该Http请求的来源地址—目标网站A只要对每一个http请求的Referer值进行验证,若不是自己允许的网站请求,则拒绝该请求;
- 优点:给所有安全敏感的请求统一加一个拦截器检查Referer的值即可,无须改变当前系统的任何已有代码和逻辑;
- 缺点
- 安全性都依赖浏览器保障,若对用户浏览器的Referer值进行篡改就会有安全问题;
- 用户关闭Referer字段,即设置浏览器在其发送请求时不再提供Referer字段;
(2)验证码;
(3)随机数token验证:在请求中放入攻击者不能伪造的信息,即不存于cookie中,服务器增加一个拦截器验证这个token,若请求没有token或token内容不正确则拒绝该请求;
- 在请求地址中添加token并验证;
- 在http headers中自定义csrftoken字段并验证;— 通过XMLHttpRequest设置header;
csrf与xss的区别
- xss:HTML的问题—内容没有过滤导致浏览器将攻击者的输入当代码执行,盗取cookie干坏事;
- csrf:HTTP的问题—浏览器发送HTTP请求时会自动带上cookie,而一般session都存在cookie里,借cookie干坏事,实质上没有拿到受害者的cookie;