XSS防范之Encode(转)

防范XSS有三道防火墙:数据的输入校验,数据输出Encode,浏览器安全(主要就是CSP),这里主要介绍Encode。

 

#用于XSS防范的Encode

用户防范XSS的Encode主要有三种:HtmlEncode,javascriptEncode,urlEncode。每种encode都有不同的使用场景。

 

#HtmlEncode

HtmlEncode将一些字符编码为html实体,比如将 <   编码为  &lt;  这样编码会起到什么效果呢?

假设页面代码如下:

 

<div>${var}</div> 

 

如果var的值被注入了恶意代码 <script>alert(1)</script>,我们知道页面返回的时候会直接弹出一个alert框,而如果对var的值进行htmlEncode后页面代码就变成了:

<div>  
    &lt;script&gt;alert(1)&lt;&#x2F;script&gt;  
</div> 

 

浏览器选后不会弹出alert框,而是将<script>alert(1)</script>显示为纯字符。
数据在标签或属性中输出时使用。

 

 

#javascriptEncode

 

使用\”对特殊字符进行转义,除数,字母之外,小于127的字符编码使用16进制“\xHH的方式进行编码,大于127用unicode

 

假设页面中有如下脚本片段:

 

 

    <script>  
    var j="${var}"  
    </script>  

 

 

假设var被恶意注入为  ";alert(1);//

 

    <script>  
    var j="";alert(1);//  
    </script>  

 

这样页面又会弹出一个alert框,而如果对  ";alert(1);//  进行javascriptEncode,则变为下面这样,不会产生注入影响

 

    <script>  
    var j="\"\x3balert\x281\x29\x3b\x2F\x2F"  
    </script>  

 

 

数据在脚本中输出或者在事件中输出时要使用javascriptEncode

 

#urlEncode

 

urlEncode可以对中文以及特殊字符进行编码,数据在url类型输出时要使用urlEncode,比如href,src

 

www.abc.com?name=<script>alert('钓鱼岛')</script>

 

对上面这句urlEncode之后就变成了:

 

www.abc.com%3fname%3d%3cscript%3ealert(%27%e9%92%93%e9%b1%bc%e5%b2%9b%27)%3c%2fscript%3e

 

 

 

#为何Encode可以起作用?

 

htmlEncode可以防止恶意的标签闭合

 

JavaScriptEncode可以防止引号闭合

 

urlEncode可以防止标签闭合同时支持中文输入

 

1)攻击一般就是通过构造一个js可执行环境或者在既有的js可执行环境里来执行恶意脚本。去除了恶意的标签闭合和引号闭合就可以有效的防止恶意脚本的注册(有些并不是立即执行)和执行。

 

2)Encode让浏览器把用户输入作为数据本身而不是作为可执行的代码。

 

3)Encode必须用在适当的位置,否则会破坏正常的语义。

 

 

 

 

 

posted @ 2018-03-31 16:24  幸福安康  阅读(725)  评论(0编辑  收藏  举报