概念javascript
存储型XSS,持久化,代码是存储在服务器中的,如在我的信息或发表文章等地方,加入代码,若是没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。css
常见的xss攻击方法html
1. 绕过XSS-Filter,利用<>标签注入Html/JavaScript代码;前端
2. 利用HTML标签的属性值进行xss攻击。例如:<img src=“javascript:alert(‘xss’)”/>;(固然并非全部的Web浏览器都支持Javascript伪协议,因此此类XSS攻击具备必定的局限性)java
3. 空格、回车和Tab。若是XSS Filter仅仅将敏感的输入字符列入黑名单,好比javascript,用户能够利用空格、回车和Tab键来绕过过滤,例如:<img src=“javas cript:alert(/xss/);”/>;web
4. 利用事件来执行跨站脚本。例如:<img src=“#” onerror= “alert(1)”/>,当src错误的视乎就会执行onerror事件;express
5. 利用CSS跨站。例如:body {backgrund-image: url(“javascript:alert(‘xss’)”)};浏览器
6. 扰乱过滤规则。例如:<IMG SRC=“javaSCript: alert(/xss/);”/>;安全
7. 利用字符编码,透过这种技巧,不只能让XSS代码绕过服务端的过滤,还能更好地隐藏Shellcode;(JS支持unicode、eacapes、十六进制、十进制等编码形式)服务器
8. 拆分跨站法,将xss攻击的代码拆分开来,适用于应用程序没有过滤 XSS关键字符(如<、>)却对输入字符长度有限制的状况下;
9. DOM型的XSS主要是由客户端的脚本经过DOM动态地输出数据到页面上,它不依赖于提交数据到服务器,而是从客户端得到DOM中的数据在本地执行。容易致使DOM型的XSS的输入源包括:Document.URL、Location(.pathname|.href|.search|.hash)、Document.referrer、Window.name、Document.cookie、localStorage/globalStorage;
传统XSS防护手段
如何根治XSS呢,这里能够负责任的告诉你,没有一种防护方法是通用万能的。XSS攻击方式根据漏洞出现位置、浏览器环境、业务环境、攻击目的、WebServer类型的不一样而变化(因此XSSer们每每称本身为猥琐流)。它不像其余web漏洞:上传、SQL注入、文件包涵,仅仅须要在服务器上作下过滤(甚至是安装一个统一过滤脚本或者WAF)就能够成功防护的,因此根据实际状况,针对XSS防护措施也是不一样的,大致来讲,有如下几点:
1.服务器端过滤
服务器端转义输入的左右尖括号,对HTML标签进行编码,这是主流的防护XSS的方法,可有效防护通常的XSS攻击。
2.前端过滤
把变量输出到页面时要作好相关的编码转义工做,如要输出到 <script>中,能够进行JS编码;要输出到HTML内容或属性,则进行HTML编码处理。
输入过滤,对用户提交的数据进行有效性验证,仅接受指定长度范围内并符合咱们指望格式的的内容提交,阻止或者忽略除此外的其余任何数据。好比:电话号码必须是数字和中划线组成,并且要设定长度上限。过滤一些些常见的敏感字符,例如:< > ‘ “ & # \ javascript expression "onclick=" "onfocus";过滤或移除特殊的Html标签, 例如: <script>, <iframe> , < for <, > for >, " for;过滤JavaScript 事件的标签,例如 "onclick=", "onfocus" 等等。
输出编码,当须要将一个字符串输出到Web网页时,同时又不肯定这个字符串中是否包括XSS特殊字符(如< > &‘”等),为了确保输出内容的完整性和正确性,可使用编码(HTMLEncode)进行处理
3.HttpOnly
在服务器端作配置,在响应头里对cookie中的session进行httponly标记,被标记的session没法被js读出,所以能够有效防护针对偷取cookie的XSS攻击。
4.Content Security Policy (CSP)
CSP策略规范了网页中某个标签所能加载的第三方域,从协议层把一些存在安全隐患的用法默认给干掉,把同源同域更发挥到了极致,结合禁止内联脚本的机制,能够有效防护大部分XSS攻击。
缺点: 须要在服务器端进行配置,并且一旦配置不当,正常业务也会受到影响。配置不严格又会致使绕过。对于大型的、复杂的网站业务,维护成本较高。
5.XSS防火墙技术
这种技术目前正处于概念阶段,并无大范围投入使用,其思路是用js代码来对当前网页进行防御,防止发生XSS行为。并且设计理念也是各有不一样。
像百度FEX设计的这款,模拟了CSP策略实现了对XSS的防护。
http://fex.baidu.com/blog/2014/06/xss-frontend-firewall-4/
过滤流程图:
针对过滤流程中的标签及黑属性,这里就很少说了,发现删除就能够,这里重点说下属性值安全,属性值大致分为3类
URL
这里指的URL,就是相似href,src等的值,这里核心的就是按照URL标准识别出引入的URL的协议,保留容许的协议便可,好比
CSS
为何要提到CSS呢,由于CSS是富文本UGC的一个核心,由于没有CSS,QQ空间日志内容则达不到用户想要的炫酷效果,为了保证CSS的安全,咱们又得再实现一个CSS语法解析器(因为当时场景须要,咱们是本身写的,不过你们也能够参考CSS Parse的开源代码)。
因为CSS的强大,因此咱们首先定义了一串黑名单,好比出现expression,background,javascript,eval一旦出现这些黑名单,这里以前犯过一个错误,就是采用删除逻辑,当遇到下面的case,真的是欲哭无泪,后来评估正常UGC,极少出现黑名单里的用法,so直接清空css。
坑1:在完成黑名单清理后,你会发现IE浏览器居然兼容以下格式的CSS(强大的\)
坑2:同时IE还兼容以下格式(&#编码,尼玛的支持编码就算了,最后的;还无关紧要)
坑3:你觉得他只认识html编码嘛,其实你错了,他还认识unicode编码。
没办法,通通黑名单搞之:出现\ 或 &# 通通清空CSS啊,清空CSS。
坑4:此时,你觉得CSS应该没事了,可是IE又出现新的兼容方式:全角字符
继续搞,只要出现全角字符,一律清空。
Flash
讲到Flash安全,就重点保障2个属性值设置合理就好了:
allowScriptAccess: & allowNetworking
若是条件容许建议统一设置为:allowScriptAccess设置为never,allowNetworking设置为none
可是业务每每须要这2个属性,好比QQ空间日志中要能播放QQ音乐,因此须要首先识别出引入的Flash地址,而后仅对白名单的放开该权限便可。
这里强烈建议你们不要使用object,由于他比embed处理要麻烦N倍,同时IE大爷对它兼容也超好,好比当识别属性名时,以下编码格式也是容许的: