Javascript Websocket将代码传递给Eval

时间:2013-09-24 01:53:40

标签: javascript websocket

我有一个javascript对象,我通过websocket作为原始文本传递给客户端。这个原始文本(现在)在收到时直接传递给eval语句。问题是,由于某种原因,Javascript在将数据传递给事件处理程序之前一直在操纵数据。我很有智慧。

通过websocket传递的对象是:

var obj = {
    evaluate:function(str) {
        digit = parseInt(str,10);
        if(isNaN(digit)) {
            log.write("Invalid input: "+str);
        } else {
            log.write(this.spigot(digit));
        }
    },
    spigot:function(digit) {
        len = Math.floor(10*digit/3)+1;
        A = new Array(len);

        for(var i=0;i<len;i++) A[i]=2;
        var finalDigit = 0;
        var nines = 0;
        var predigit = 0;

        for(i=1;i<digit+1;i++) {
            q = 0;
            for(j=len;j>0;j--) {
                x = 10*A[j-1] + q*j;
                x = Math.floor(x)
                A[j-1] = x % ((2*j)-1);
                A[j-1] = Math.floor(A[j-1]);
                q = x / ((2*j) -1);
                q = Math.floor(q);
            }

            A[0] = Math.floor(q%10);
            q = Math.floor(q/10);

            if(q==9) {
                nines++;
            } else if (q==10) {
                finalDigit = predigit+1;
                for(j=0;j<nines;j++) {
                    finalDigit = 0;
                }
                predigit=0;
                nines=0;
            } else {
                finalDigit = predigit;
                predigit=q;
                for(j=0;j<nines;j++) {
                    finalDigit = 9;
                }
                nines=0;
            }
        }
        return finalDigit;
    }
}

客户端收到整个邮件(我使用Chrome的开发人员工具和Firebug进行了检查)。但是,当我在以下事件处理程序中收到消息时:

function socketMessage(e) {
    log.write(e.data); //a log function I have written
}

e.data包含:

obj = {
    evaluate:function(str) {
        digit = parseInt(str,10);
        if(isNaN(digit)) {
            log.write('Invalid input: '+str);
        } else {
            log.write(this.spigot(digit));
        }
    },
    spigot:function(digit) {
        len = Math.floor(10*digit/3)+1;
        A = new Array(len);

        for(var i=0;i<len;i++) A[i]=2;
        var finalDigit = 0;
        var nines = 0;
        var predigit = 0;

        for(i=1;i<digit+1;i++) {
            q = 0;
            for(j=len;j>0;j--) {
                x = 10*A[j-1] + q*j;
                x = Math.floor(x)
                A[j-1] = x %((MISSING)(2*j)-1);
                A[j-1] = Math.floor(A[j-1]);
                q = x / ((2*j) -1);
                q = Math.floor(q);
            }

            A[0] = Math.floor(q%)(MISSING);
            q = Math.floor(q/10);

            if(q==9) {
                nines++;
            } else if (q==10) {
                finalDigit = predigit+1;
                for(j=0;j<nines;j++) {
                    finalDigit = 0;
                }
                predigit=0;
                nines=0;
            } else {
                finalDigit = predigit;
                predigit=q;
                for(j=0;j<nines;j++) {
                    finalDigit = 9;
                }
                nines=0;
            }
        }
        return finalDigit;
    }
}

注意代码是如何变异的。在其中添加了随机(MISSING)个字符串,并且已经截断了几个方程式。

为什么会这样?

编辑1:

在玩了一会儿之后,我注意到它发生在%符号之后,无论其位置如何......所以我的问题是,为什么%运算符在这里有重要意义事件监听器要屠宰我代码的内容吗?

编辑2:

在传递给我的回调函数之前,%被解释为转义字符。我在尝试使用%25之前通过套接字发送它,但无济于事。

1 个答案:

答案 0 :(得分:0)

Javascript将%字符解释为转义字符。您看到的(MISSING)文字是Javascript告诉您转义字符后面没有两位数转义码的方式。解决此问题的最简单方法是定义一个函数mod(a,b)来完成与模数相同的操作。即:

....},
mod:function(a,b) {
    return (a/b-Math.floor(a/b))*b;
}

然后当您需要使用模数运算符时,只需调用

即可
Math.floor(this.mod(q,10));