我正在制作一个AJAX聊天室,指导我使用JSON和eval()函数。 这个聊天室具有正常的聊天功能和白板功能。 当一个正常的文本消息来自JSON格式的PHP服务器时,浏览器中的javascript会这样做:Javascript json eval()注入
没有白板命令--------------------- ----------------------
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稍作修改:
With Whiteboard Command ---------------------------------- ----------------
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的drawLine的(200345222333),他被注射redirectToMyVirusSite()。 eval()将在聊天室中的每个人的浏览器中为他运行。 因此,正如你所看到的,让评估者从聊天室中的其他客户端执行命令显然是黑客邀请。我了解我所遵循的这本书只是为了介绍这些功能。在真实情况下,我们如何正确使用JSON来做到这一点?
例如是否有一个服务器端PHP或.NET功能javascriptencode /逃生,以确保没有黑客可以发送一个有效的JavaScript代码块到其他客户端的浏览器是eval()?或者可以安全地使用JSON eval(),它似乎是一个强大但邪恶的功能?
谢谢 汤姆
把那本书扔掉。 – 2012-04-18 14:20:30
这就是我讨厌网页开发书籍的原因。他们无法通过网络进行更改。 'eval()'=邪恶 – iambriansreed 2012-04-18 14:22:56