Лучшая практика с метеорным webApp, чтобы избежать xss? - PullRequest
0 голосов
/ 14 мая 2019

Я использую веб-приложение для приема запросов, которые добавят элементы в мой экземпляр mongoDB.

Это удивительно, потому что это обеспечивает совместимость с другими службами.

У меня сейчас два вопроса:

  1. Я выполняю проверку всех элементов запроса. к сожалению, независимо от того, как я их проверяю, они, кажется, всегда передаются в виде строк, есть ли способ принять тип int или около того.

  2. Помимо использования check для проверки структуры запроса json, что еще я могу использовать, чтобы избежать любых межсайтовых инъекций? (XSS)

Это очень важно для меня, так как элементы в этом запросе перейдут в мою базу данных

Как уже упоминалось выше, я использую проверку и выбрасываю ошибку, когда структура не идеальна, я понимаю, что только потому, что структура правильная, это не означает, что контент не может быть использован для атаки 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 ]

1 голос
/ 15 мая 2019

Таким образом, ответ от 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;
  }
1 голос
/ 14 мая 2019

Прежде всего вы должны экранировать специальные символы HTML <, >, ", &.Замените их на &lt;, &gt;, &quot;, &amp;.

Но этого может быть недостаточно .Также проверьте шпаргалку OWASP XSS на наличие потенциальных угроз.

Еще одна замечательная вещь, которую вы можете сделать, это реализовать заголовок CSP, чтобы блокировать весь контент, который не одобрен тем, что вы в нем установили. Google и Mozilla .Также может быть полезен заголовок XSS-Protection .

Вторая часть вашего вопроса ... для проверки входных данных вам, скорее всего, следует использовать регулярное выражение.

...