User Enumeration

Code vulnerable to a timing attack
app.post('/login', (request, response) => {
  const user = getUser(request.params.username);

  // The function returns early if the username is incorrect.
  if (!user) {
    response.status(401);
    return;
  }

  // This code path will only get executed if the username is
  // correct, allowing an attacker to infer the existence of a
  // username by timing how long the HTTP response takes.
  bcrypt.compare(request.params.password, user.hashedPassword, (error, matched) => {
    if (matched) {
      request.session.username = request.params.username;
      self.redirect('/');
    } else {
      response.status(401);
    }
  });
});