阻止攻击的常用方法是:在将HTML返回给Web浏览器之前,对攻击者输入的HTML进行编码。HTML编码使用一些没有特定HTML意义的字符来代替那些标记字符(如尖括号)。这些替代字符不会影响文本在web浏览器上的显示方式,仅仅用于阻止HTML渲染引擎将数据识别成HTML标记。这种方法能阻止一些XSS攻击,但是以下几种情况例外:

在Script块中插入:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
<script>
...
var strEmailAdd = 'attacker data';
...
</script>

在这个例子中,数据本身就已经在script块中了,攻击者要做的就是关闭引用标记。

...
var strEmailAdd = '';alert('Hi');//
...

引号加分号结束,最后可以注释掉其他输出内容避免出现阻止脚本运行的语法错误。

 

使用事件:

在HTML中,标记的属性能够被封装在单引号和双引号中,或者不需要引号。如果HTML的设计人员没有使用双引号来封装属性值,并对用户的数据进行了HTML编码,那么,这些不可信的数据会被限制在标记的范围内,而不是限制在属性的范围内。大部分的标记有事件发生的时候,用户定义的与那个事件相关联的脚本就会运行。

如果不可信数据经过HTML编码,并且在HTML中返回如下内容的时候,脚本仍然能够运行:

 

<INPUT name="txtinput" type="text" value='unTrustData'>

如果 OurData' onclick=alert(Hi) junk=' 作为不可信数据发送,将会返回如下所示HTML:

<INPUT name="txtinput" type="text" value=' OurData' onclick=alert('Hi') junk=''>

当用户单击文本框时,onclick事件就被激发了,脚本就会运行。

 

使用Style:

Style中的表达式能够被用来运行任意脚本,例如:

<INPUT name="txtinput" type="text" value="SomeValue" style="font-family:expression(alert('Hi'))">

脚本协议:

通过IMG标记中src属性值的形式,将它们返回。

<IMG src="untrusted data">

 

 两种不同过滤的例子:

1.在返回数据前,删除输入中的字符串。但是如果输入scriscriptpt,删除后剩下的就是script。

2.通过转义来阻止分隔属性。

 

深入理解浏览器中的解析器:在<script>和</script>之间的任何东西都会被当作脚本,并对它们进行语法检查。

<script>
var strMyVar = '</script><script>alert('快船总冠军')</script>';
...
</script>

浏览器会把上述内容解释为两个<script>块,第一个块有语法错误,并且不会运行。但是第二个块语法正确会运行。

 

 

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄