我在 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 代码,而不是 drawLine(200,345,222,333),他正在注入 redirectToMyVirusSite()。eval() 只会在聊天室中每个人的浏览器中为他运行它。因此,如您所见,让 eval 执行聊天室中其他客户端的命令显然是黑客邀请。我知道我所遵循的这本书只是对功能的介绍。在实际情况下,我们如何正确使用 JSON?
例如,javascriptencode/escape 是否有服务器端 php 或 .net 函数,以确保没有黑客可以将有效的 javascript 代码发送到其他客户端的浏览器作为 eval() ?或者使用 JSON eval() 是否安全,它似乎是一个强大但邪恶的功能?
谢谢你,汤姆