setTimeout()和setInterval()可以用来注册在指定的时间之后单次或重复调用的函数。

由于历史原因,第一个参数可以作为字符串传入,相当于执行eval(),因此可以作为XSS Payload使用。

语法

var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]);
var timeoutID = scope.setTimeout(function[, delay]); 
var timeoutID = scope.setTimeout(code[, delay]);

参数

code 参数,使用字符串来替代函数,在delay毫秒之后编译和执行字符串,相当于执行eval()函数。

delay 参数,可选,默认为0毫秒。当以0毫秒的超时时间来调用setTimeout(),那么指定的函数并不会立刻执行。相反,回把它放到队列中,等前面处于等待状态的事件处理程序全部执行完成后,才会调用。

param 参数,向回调函数function传递额外参数。

返回值

返回值 timeoutID是一个正整数,表示定时器的编号。

定时器的编号可以传递给clearTimeout()和clearInterval()来取消定时器。

演示

setTimeout('alert(1)');

1.png

setTimeout('\x61\x6c\x65\x72\x74\x28\x31\x29');

2.png

3.png

相关文章

https://developer.mozilla.org/zh-CN/docs/Web/API/Window/setTimeout

《JavaScript权威指南》14.1 定时器