Javascript Websocket 将代码传递给 Eval

标签 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)字符串,并且几个方程已被 chop 。

为什么会发生这种情况?

编辑1:

玩了一段时间后,我注意到它发生在 % 符号之后,无论其位置如何......所以我的问题是,为什么 % 具有重要意义操作符在这里导致事件监听器屠杀我的代码内容?

编辑2:

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

最佳答案

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

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

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

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

关于Javascript Websocket 将代码传递给 Eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18971764/

相关文章:

javascript - 无法在 addEventListener 函数之外获取视频持续时间

javascript - 通过模型Backbone更新变量

javascript - Bootstrap 灯箱。如何在自己的站点中使用简单示例?

javascript - Ember 过渡和渲染完成事件

javascript - WebSocket 服务器 Javascript 实现

node.js - Node net.createConnection ECONNREFUSED

python - 在 Django 2.0 中使用 Slack RTM API

javascript - 为什么 document.body 在我的 javascript 中为空?

javascript - Websocket建立防弹连接

C-websocket-recv 读取的内容超过有效负载长度