Node.js/JavaScript-避免用户输入脚本和html实体
Node.js/JavaScript - Avoid users entering scripts and html entities
很难解释,但我会尝试:基本上我有一个在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()
的需求,但这取决于这些消息在其他地方传递。
相关文章:
- 密码输入键脚本在首次使用后无法工作
- 阻止用户将脚本输入wordpress post
- 为什么我用于检查所需输入字段的jQuery脚本如此缓慢
- 将脚本应用于Angular 2上的输入
- HTML表单-按'时执行脚本;输入',无需提交
- 动态添加的输入元素不会在脚本中返回值
- 如何在呈现页面后使用 Java 脚本检测 dom 元素值的值是否有任何变化(例如,任何输入或复选框值更改)
- 我将如何在将数据发布到 php 脚本的 javascript 脚本中输入变量
- 脚本选择所有输入,而不仅仅是复选框
- 如何使用jasper服务器的输入控件激发脚本
- 使用html表单作为python脚本输入的简单解决方案
- Commander.js:脚本未等待用户输入
- 链接输入表单中的填充脚本
- 在相同的html上使用相同的脚本和不同的输入
- 应用脚本的绑定方式因输入源而异
- 从脚本添加的输入框中获取值
- 使用表单输入中的咖啡脚本编辑保存的值
- Java脚本输入日期HTML格式
- 使用java脚本输入值后,网页中的文本字段没有更新
- 如何通过Java脚本输入邮政编码自动完成城市状态