2014-10-31 19 views
0

所以有点难以解释,但我会尝试:的Node.js/JavaScript的 - 避免用户进入脚本和HTML实体

function sentMessage(){ 
    if($('#messageInput').val() != "") 
    { 
    socket.emit('message', $('#messageInput').val()); 
    addMessage($('#messageInput').val(), "Me", new Date().toISOString(), 
    true); 
    $('#messageInput').val(''); 
    } 
} 

所以这个:对Node.js的 客户端运行 基本上我有聊天应用做两件事:
它发送消息到服务器说有新消息,同时它将消息添加到chatwindow(客户端)。

服务器端:

socket.on('message', function (message) { 
    socket.broadcast.emit('message', { 
     'message' : entities.encode(message), 
     'pseudo' : socket['final_user'] 
    }); 
db.query('INSERT INTO messages (user_id, message) VALUES (\ 
"'+socket['final_user']+'", "'+db.escape(message)+'")');  
}); 

所以服务器检测到新的消息,并广播给所有用户说有新的消息,在这里它与人姓名。它也将其插入到数据库中。所以我的问题是:如果用户输入类似的东西或警报(“你好”);

WORKS罚款为其他用户,它不会出现,并显示为明码,而不会造成混乱,但谁进入它的用户 - 它打印的图像和警告框。

此外每当用户以后登录时,老消息使用此函数加载:

function loadMessages(msg, pseudo, time){ 
    $("#chatEntries").append('<div class="messagesOLD">' + 
    "<span class='msg_date'>"+dateFormat(time)+"</span><span class='msg_seperator'> | </span><span class='msg_name'>"+ pseudo + '</span> : ' + msg + '</div>'); 
} 

它还打印警报和图像用户。 我知道很多人可能会说,像我在服务器端使用entities.encode(),但由于某种原因,它不适用于客户端。

好吧我设法修复加载以前的消息和加载脚本给用户,因为他们从服务器端加载,所以我能够使用entities.encode(),所以现在脚本和所有可能的漏洞显示为普通的代码和没有执行。

但是,键入它的用户仍然可以执行脚本。

function addMessage(msg, pseudo){ 
    var post_date = new Date(); 
    var timesp = post_date; 
    if(pseudo == "Me"){ 
    $("#chatEntries").append('<div class="message msg_owner">' + 
    "<span class='msg_date'>"+dateFormat(timesp)+"</span><span class='msg_seperator'> | </span><span class='msg_name'>"+ pseudo + '</span> : ' + msg + '</div>'); 

    } 
    else{ 
    $("#chatEntries").append('<div class="message">' + 
    "<span class='msg_date'>"+dateFormat(timesp)+"</span><span class='msg_seperator'> | </span><span class='msg_name'>"+ pseudo + '</span> : ' + msg + '</div>'); 
    } 
     $('#chatEntries').scrollTop(1E10); 
    } 
+0

听起来就像是完全客户端的东西。 'addMessage'函数的内容是什么 - 这可能是错误所在的地方 – 2014-10-31 14:12:06

+0

为什么不在'loadMessages'函数中使用'entities.encode()'? – Pointy 2014-10-31 14:13:15

+0

它看起来像只在实体到达服务器时进行编码 - 所以当添加到本地时,它不会被编码。您可能需要查看您需要编码的点。就个人而言,我可能只是在它显示在屏幕上之前这样做,并在传输/数据存储过程中保持键入 – 2014-10-31 14:13:17

回答

1

jQuery documentation for append

不要使用这些方法来插入从不受信任来源 如URL查询参数,Cookie或表单输入字符串获得。做 这样可以引入跨站点脚本(XSS)漏洞。将内容添加到该文件

代替之前删除或 逃避任何用户输入,使用text method

var newmsg = $('<div class="message msg_owner">' + 
    "<span class='msg_date'>"+dateFormat(timesp)+ 
    "</span><span class='msg_seperator'> | </span><span class='msg_name'>" + 
    pseudo + '</span> : <span class="msg"></span></div>'); 

//insert the new message using .text, which will encode the message at this point 
newmsg.find(".msg").text(msg) 

$("#chatEntries").append(newmsg); 

注意添加msg类的 - 如果你已经使用了这个其他地方,你可能需要改变它。

这个应该在服务器端完全否定entities.encode()的需要,但它取决于这些消息在哪里传递。

+0

理论上,如果他在服务器上正确地清理了他的数据(我们希望如此),那么他的代码不应该受到攻击。 – Mark 2014-10-31 14:29:16

+0

这是纯粹的魔法,工作。 – arleitiss 2014-10-31 14:31:25

+1

他是发送给其他用户的消息,但本地用户未被清理。就我个人而言,我不喜欢看到事物编码,直到他们需要 - 它通常导致双重编码等。在这种情况下,它需要被编码的点是因为它被放入HTML – 2014-10-31 14:31:27