内容安全策略'unsafe-eval':如何避免在javascript jquery.timer.js中使用eval()?

时间:2017-11-23 15:57:23

标签: javascript jquery jquery-plugins eval

如何避免在以下jquery.timer.js的第10行中使用eval?

摆脱eval的原因是因为我的网站正在转向CSP并且现在需要'unsafe-eval'。

对于这个用例,可能还有eval()的替代方法。

我有点卡住了。非常感谢任何帮助。

;
(function($) {
    $.timer = function(func, time, autostart) {
        this.set = function(func, time, autostart) {
            this.init = true;
            if (typeof func == 'object') {
                var paramList = ['autostart', 'time'];
                for (var arg in paramList) {
                    if (func[paramList[arg]] != undefined) {
                        eval(paramList[arg] + " = func[paramList[arg]]");
                    }
                };
                func = func.action;
            }
            if (typeof func == 'function') {
                this.action = func;
            }
            if (!isNaN(time)) {
                this.intervalTime = time;
            }
            if (autostart && !this.isActive) {
                this.isActive = true;
                this.setTimer();
            }
            return this;
        };

        (...)
        this.setTimer = function(time) {
            var timer = this;
            if (typeof this.action != 'function') {
                return;
            }
            if (isNaN(time)) {
                time = this.intervalTime;
            }
            this.remaining = time;
            this.last = new Date();
            this.clearTimer();
            this.timeoutObject = window.setTimeout(function() {
                timer.go();
            }, time);
        };
        this.go = function() {
            if (this.isActive) {
                this.action();
                this.setTimer();
            }
        };
        if (this.init) {
            return new $.timer(func, time, autostart);
        } else {
            this.set(func, time, autostart);
            return this;
        }
    };
})(jQuery);

1 个答案:

答案 0 :(得分:1)

如果paramList很大,那么虽然费力和容易出错,但您可以手动设置变量值,因为paramList不是动态创建的

对于autostarttime,您将使用以下内容:

if(func['autostart'] != undefined) {
    autostart = func['autostart'];
}

if(func['time'] != undefined) {
    time = func['time'];
}

请注意,此解决方案完全依赖于您事先知道paramList的内容这一事实。

在您提供的代码的上下文中,您可以像这样修改this.set

this.set = function(func, time, autostart) {
    this.init = true;
    if (typeof func == 'object') {

        /* Modified Code */
        if(func['autostart'] != undefined) {
            autostart = func['autostart'];
        }

        if(func['time'] != undefined) {
            time = func['time'];
        }
        /* End Modified Code */

        func = func.action;
    }
    if (typeof func == 'function') {
        this.action = func;
    }
    if (!isNaN(time)) {
        this.intervalTime = time;
    }
    if (autostart && !this.isActive) {
        this.isActive = true;
        this.setTimer();
    }
    return this;
};