Javascript json eval()注入

Javascript json eval()注入,javascript,json,eval,code-injection,Javascript,Json,Eval,Code Injection,我在一本AJAX书籍的指导下制作了一个AJAX聊天室,该书教我如何使用JSON和eval()函数。 该聊天室具有正常的聊天功能和白板功能。 当php服务器发出JSON格式的普通文本消息时,浏览器中的javascript会执行以下操作: 没有白板命令------------------------------------------- function importServerNewMessagesSince(msgid) { //loadText() is going to return

我在一本AJAX书籍的指导下制作了一个AJAX聊天室,该书教我如何使用JSON和eval()函数。 该聊天室具有正常的聊天功能和白板功能。 当php服务器发出JSON格式的普通文本消息时,浏览器中的javascript会执行以下操作:

没有白板命令-------------------------------------------

function importServerNewMessagesSince(msgid) {
    //loadText() is going to return me a JSON object from the server
    //it is an array of {id, author, message}
    var latest = loadText("get_messages_since.php?message=" + msgid);
    var msgs = eval(latest);
    for (var i = 0; i < msgs.length; i++) {
                    var msg = msgs[i];
                    displayMessage(escape(msg.id), escape(msg.author), escape(msg.contents));
    }   ...
function importServerNewMessagesSince(msgid) {
    //loadText() is going to return me a JSON object from the server
    //it is an array of {id, author, message}
    var latest = loadText("get_messages_since.php?message=" + msgid);
    var msgs = eval(latest);
    for (var i = 0; i < msgs.length; i++) {
                    var msg = msgs[i];
                    if (msg.author == "SVR_CMD") {

                        eval(msg.contents);  // <-- Problem here ...

                         //I have a javascript drawLine() function to handle the whiteboard drawing
                        //server command sends JSON function call like this: 
                        //"drawLine(200,345,222,333)" eval() is going to parse execute it
                        //It is a hacker invitation to use eval() as someone in chat room can
                        //insert a piece of javascript code and send it using the name SVR_CMD?

                   else {
                        displayMessage(escape(msg.id), escape(msg.author), escape(msg.contents));
                    }

    }   ...
函数importServerNewMessagesSince(msgid){
//loadText()将从服务器返回一个JSON对象
//它是一个数组{id,author,message}
var latest=loadText(“get_messages_-since.php?message=“+msgid”);
var msgs=评估(最新);
对于(变量i=0;i

服务器以JSON格式发送白板绘图命令,并使用名为“SVR_CMD”的特殊用户名,现在javascript略有更改:

使用白板命令--------------------------------------------------

function importServerNewMessagesSince(msgid) {
    //loadText() is going to return me a JSON object from the server
    //it is an array of {id, author, message}
    var latest = loadText("get_messages_since.php?message=" + msgid);
    var msgs = eval(latest);
    for (var i = 0; i < msgs.length; i++) {
                    var msg = msgs[i];
                    displayMessage(escape(msg.id), escape(msg.author), escape(msg.contents));
    }   ...
function importServerNewMessagesSince(msgid) {
    //loadText() is going to return me a JSON object from the server
    //it is an array of {id, author, message}
    var latest = loadText("get_messages_since.php?message=" + msgid);
    var msgs = eval(latest);
    for (var i = 0; i < msgs.length; i++) {
                    var msg = msgs[i];
                    if (msg.author == "SVR_CMD") {

                        eval(msg.contents);  // <-- Problem here ...

                         //I have a javascript drawLine() function to handle the whiteboard drawing
                        //server command sends JSON function call like this: 
                        //"drawLine(200,345,222,333)" eval() is going to parse execute it
                        //It is a hacker invitation to use eval() as someone in chat room can
                        //insert a piece of javascript code and send it using the name SVR_CMD?

                   else {
                        displayMessage(escape(msg.id), escape(msg.author), escape(msg.contents));
                    }

    }   ...
函数importServerNewMessagesSince(msgid){
//loadText()将从服务器返回一个JSON对象
//它是一个数组{id,author,message}
var latest=loadText(“get_messages_-since.php?message=“+msgid”);
var msgs=评估(最新);
对于(变量i=0;ieval(msg.contents);//这本书是什么?
eval
是邪恶的,从来没有一个理由使用它

要将JSON字符串转换为javascript对象,可以执行以下操作:

var obj = JSON.parse(latest)
这意味着您可以使用:

[].forEach.call(obj, function( o ) {
    // You can use o.message, o.author, etc.
} )
要执行相反的操作(javascript对象->JSON字符串),请执行以下操作:

var json = JSON.stringify(obj)

只有当执行的代码是由其他客户端而不是服务器生成时,它才是不安全的。当然,您需要阻止任何人使用该名称,尽管我不明白您为什么要使用“author”字段?只需发送一个对象
{“whiteboard”:“drawLine(x,y,z)”}
,而不是
{“author”:“SVR_CMD”,“contents”:“drawLine”(x,y,z)“}

但这是对的,eval()仍然是黑客的邀请函。人们总是可以发送无效数据,并试图或多或少直接影响输出。唯一的转义方法是正确序列化要接收和发送的数据-图形数据。如何接收白板命令?服务器端没有“转义”函数使javascript代码“干净”——这将永远是一个安全漏洞

我希望像这样的连载

message = {
    "author": "...", // carry the information /who/ draws
    "whiteboard": {
         "drawline": [200, 345, 222, 333]
    }
}
因此,您可以轻松地清理命令(此处为:“drawline”)


eval()的使用
如果您有非常复杂的命令,并且希望通过在服务器端构建它们来减少传输的数据,则可以。不过,您仍然需要正确解析和转义从其他客户端接收到的命令。但我建议找到一个不使用eval的解决方案。

将eval问题放在一边,不要使用用户可以填写的字段-
.author
在代码中-用于身份验证。在JSON消息中添加另一个字段,例如
。is_server_命令
,当该字段存在时,将表示对消息进行特殊处理。该字段不依赖于用户输入,因此不会被“黑客”劫持.

这就是我讨厌网络开发书籍的原因。它们不能随网络而改变。
eval()
=evilauthor是“显示名称”关于用户。关于谁键入了消息和/或谁在白板上绘制了图片。我从书中复制并粘贴了它。只想让核心工作,然后讨论成员资格问题。我是json新手。eval()复制的代码中的函数引起了我的注意。因此我对此发表了一篇文章。是的。正是因为用户决定了该字段中的内容,所以您不能将其用于本应由服务器决定的内容。“特殊”用户名可以是SVR_CMD,也可以是“34ee52aa3457ff”或任何令牌。当发出白板绘制命令时,此id将向打开以查看源代码的任何人公开。因此黑客可以随时复制该令牌并模拟服务器命令。我的观点是,问题似乎是eval()太强大了,可以从用户注入中执行一段代码。如果您使用另一个只能由服务器生成且不受用户输入影响的字段,则可以避免此问题。eval功能强大,但如果只有在服务器使用仔细的服务器生成的数据批准时才调用它,则它是非常安全的。1.代码重用他导入ServerNewMessagessince()函数,并将author=svr_cmd视为特殊用户,其中“contents”字段具有javascript命令。2.它在“contents”字段中接收白板命令drawLine(x,y,z,w),其中drawLine()是网页中的javascript函数。eval(“drawLine(x,y,z,w)”)然后将直接执行该函数。不,问题是“服务器如何接收划一条线的命令?”。如果服务器接收到javascript代码字符串,这不仅是对黑客工具的邀请,而且是一扇敞开的大门!根据Angus Croll的说法,JSON.parse使用eval()本身。@Goose是的,
eval
是有用法的。(这个答案已经3岁了,我以前对事情很坚持。)但是,我还是建议永远不要使用它。一个有经验的程序员会认识到用例是非常有限的,并且会知道在编程中,教条不能解决问题:)另外,在现代浏览器中,
JSON.parse
不使用
eval
。请参见例如v8源代码:@Goose另一件事:你可以只看源代码,而不是引用其他人。对于Crockford,对于jQuery。顺便说一句,这表明jQuery不再使用
eval
。(也就是说,你的文章很旧。)谢谢你的回答。我不想检查源代码。我以后会尝试。JSON/mod