从数据库中检索后,在保存或清理输入之前清理用户输入?

时间:2018-03-20 23:11:51

标签: javascript node.js mongodb mongoose xss

我想将用户输入保存到我的数据库中,但我不确定在保存到数据库之前是否应该清理用户输入,或者在从数据库中获取并在HTML中显示它们之后是否应该清理用户输入?

喜欢这里(保存前):

var topic=htmlencode.htmlEncode(req.body.topic);
var topiccontent=req.body.topiccontent;
var z=markdown.toHTML(topiccontent);
   var clean = sanitizeHtml(z, {
  allowedTags: ['b', 'i', 'em', 'strong', 'a','h1','h2','h3','h4','h5','h6','img','blockquote','code','br'],
  allowedAttributes: {'a': [ 'href','alt','title' ],'img':['src','alt','title']},
  
  allowedIframeHostnames: []
});
var opentopic=new topics({topic:topic,topiccontent:topiccontent,writerid:req.session.id,tür:tür,begeni:0,writernick:req.session.nick});

并且(清理数据库中的输入):

topics.findOne({topic:req.query.w},function(err,topic){
var topic=htmlencode.htmlEncode(topic.topic);

var topiccontent=topic.topiccontent;

var y=markdown.toHTML(topiccontent);
   var clean = sanitizeHtml(y, {
  allowedTags: ['b', 'i', 'em', 'strong', 'a','h1','h2','h3','h4','h5','h6','img','blockquote','code','br'],
  allowedAttributes: {'a': [ 'href','alt','title' ],'img':['src','alt','title']},
  
  allowedIframeHostnames: []
});
res.render('./show',{topic:topic,topiccontent:topiccontent....})
})

1 个答案:

答案 0 :(得分:0)

根据the documentation

当客户端程序在MongoDB中组装一个查询时,它会构建一个BSON对象,而不是一个字符串。因此传统的SQL注入攻击不是问题。

因此,在将数据存储到数据库之前对用户输入进行“消毒”并不像在MySQL中那样需要进行“消毒”,但是有一些与MongoDB相关的注入技术应该进行一些研究。

话虽如此,这是有意义的,因为你想在显示用户输入之前这样做,因为我相信你也明白这一点非常重要。

以这种方式思考,如果在保存之前“清理”该值,那么您只需计算一次该结果。但是,如果您每次从数据库中获取并为用户显示它时都这样做,那么您将无限次地计算结果并最终减慢用户对最终结果的访问速度。

另请注意Javascript part of the documentation

以下所有MongoDB操作都允许您直接在服务器上运行任意JavaScript表达式:

$where
mapReduce
group

在这些情况下,您必须小心谨慎,以防止用户提交恶意JavaScript。