ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Javascript json eval()注入

2019-07-15 17:33:24  阅读:243  来源: 互联网

标签:json javascript eval code-injection


我正在制作一个AJAX聊天室,在AJAX教学的指导下教我使用JSON和eval()函数.
这个聊天室具有正常的聊天功能和白板功能.
当普通文本消息来自jSON格式的php服务器时,浏览器中的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));
    }   ...

服务器以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];
                    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));
                    }

    }   ...

现在,如果黑客在脚本中将其用户名更改为SVR_CMD,则在消息输入中开始输入javascript代码,insdead of drawLine(200,345,222,333),他正在注入redirectToMyVirusSite(). eval()将在聊天室的每个人的浏览器中为他运行它.
因此,正如您所看到的,让eval从聊天室中的其他客户端执行命令显然是黑客邀请.我理解我所遵循的这本书只是为了介绍这些功能.在真实情况下我们如何使用JSON正确完成?

例如是否有一个服务器端php或.net函数到javascriptencode / escape,以确保没有黑客能够将有效的javascript代码发送到其他客户端的浏览器为eval()?或者根本不使用JSON eval(),它似乎是一个强大而又邪恶的功能?

谢谢,
汤姆

解决方法:

这本书是什么? 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)

标签:json,javascript,eval,code-injection
来源: https://codeday.me/bug/20190715/1469982.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有