Tom*_*Tom 3 javascript json 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));
} ...
Run Code Online (Sandbox Code Playgroud)
服务器以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));
}
} ...
Run Code Online (Sandbox Code Playgroud)
现在,如果黑客改变他的用户名SVR_CMD脚本,然后在消息输入开始键入javascript代码,insdead的drawLine的(200345222333),他被注射redirectToMyVirusSite().eval()将在聊天室的每个人的浏览器中为他运行它.因此,正如您所看到的,让eval从聊天室中的其他客户端执行命令显然是黑客邀请.我理解我所遵循的这本书只是为了介绍这些功能.在真实情况下我们如何使用JSON正确完成?
例如,是否存在服务器端php或.net函数到javascriptencode/escape以确保没有黑客可以将有效的javascript代码发送到其他客户端的浏览器为eval()?或者根本不使用JSON eval(),它似乎是一个强大而又邪恶的功能?
汤姆,谢谢你
这本书是什么?eval是邪恶的,永远没有一个理由可以使用它.
要将JSON字符串转换为javascript对象,您可以执行以下操作:
var obj = JSON.parse(latest)
Run Code Online (Sandbox Code Playgroud)
这意味着您可以使用:
[].forEach.call(obj, function( o ) {
// You can use o.message, o.author, etc.
} )
Run Code Online (Sandbox Code Playgroud)
为了做相反的事情(javascript对象 - > JSON字符串),以下工作原理:
var json = JSON.stringify(obj)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4713 次 |
| 最近记录: |