流星webApp避免xss的最佳做法?

时间:2019-05-14 07:55:41

标签: javascript meteor

我正在使用webapp接受将项目添加到mongoDB实例的请求。

这令人惊奇,因为它允许与其他服务兼容。

我目前有两个问题:

  1. 我对所有查询元素进行检查。不幸的是,无论我如何检查它们,它们似乎总是以字符串形式传递,是否有任何方法可以接受int类型。

  2. 除了使用check来验证json查询的结构外,还有什么我可以用来避免跨站点注入的? (XSS)

这对我来说至关重要,因为此查询中的项目将传递到我的数据库中

如上所述,当结构不完美时,我确实使用了check并抛出错误,我意识到仅仅因为结构正确并不意味着内容不能用于XSS攻击

针对以下请求

http://localhost:3000/request?token=1234567890&id=id123&timeStamp=234234&item=uy3242&anotherItem=111222

WebApp.connectHandlers.use('/request', (req, res, next) => {

  //check validity of the query
  try{
    var matchTest = check(req.query, {
      token : String,
      id : String,
      timeStamp : String,
      item : String,
      anotherItem : String
    });
  }catch (err){
    res.writeHead(406);
    res.end(`request failed check`);
  }

  //check validity of the token
  try{
    //is it a good idea to use req.query.token? or should I stringify it first?
    validateToken(req.query.token);
  }
  catch(err) {
    res.writeHead(401);
    res.end(`Invalid Token`);
  }

  //finally save information needed to DB
  myCollectionName.insert(req.query);

  res.writeHead(200);
  res.end(`request Passed!`);


});

我要实现的目标是避免xss的可靠方法,也许还可以执行检查以验证(例如,令牌)实际上是一个整数并且其中没有字母,依此类推

2 个答案:

答案 0 :(得分:1)

首先,您应转义HTML特殊字符<>"&。将它们替换为&lt;&gt;&quot;&amp;

但是那个might not be enough。还要检查OWASP XSS cheat sheet是否存在潜在威胁。

您可以做的另一件事是实现CSP标头,以阻止所有未经您设置的内容批准的内容。 GoogleMozilla指南。 此外,XSS-Protection标头也可以有所帮助。

问题的第二部分..要验证输入,您很可能应该使用正则表达式。

答案 1 :(得分:0)

所以cray的答案中包含了在正确的路径发送我的信息。

为了向最终落在这里的人澄清一下,我最终使用了流星检查来确保收到的所有内容都是字符串。并且完全在我需要的结构之内,即未添加其他查询项。

    var matchTest = check(req.query, {
      token : String,
      id : String,
      timeStamp : String,
      item : String,
      anotherItem : String
    });

然后我继续使用正则表达式检查其中是否有不良字符(实际上非​​常简单)

  try{
    var itemToCheck = "hello{console.log(\"attemptingSomething\")}";
    const pattern = /\W/g; //Checks for any non word characters, anything that is not letters or numbers
    return pattern.test(itemToCheck); //will return true if something,in this case, bad is found
  }
  catch(e){
    if(e) throw e;
  }