Node.js/JavaScript-避免用户输入脚本和html实体

Node.js/JavaScript - Avoid users entering scripts and html entities

本文关键字:脚本 输入 html 实体 用户 js JavaScript- Node      更新时间:2023-09-26

很难解释,但我会尝试:基本上我有一个在Node.js上运行的聊天应用程序客户端:

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

所以这做了两件事:
它向服务器发送消息,表示有新消息,同时向聊天窗口(客户端)添加消息。

服务器端:

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>');
}

它还向用户打印警报和图像。我知道很多人可以说只使用entity.encode(),就像我在服务器端所做的那样,但由于某种原因,它在客户端不起作用。

好吧,我设法修复了加载以前的消息和向用户加载脚本的问题,因为它们是从服务器端加载的,所以我可以使用entity.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);
    }

来自append:的jQuery文档

不要使用这些方法插入从不受信任的字符串URL查询参数、cookie或表单输入等源。正在执行因此可能引入跨站点脚本(XSS)漏洞。删除或在将内容添加到文档之前逃离任何用户输入

相反,使用text方法:

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()的需求,但这取决于这些消息在其他地方传递。