Можно ли не отправлять ответ на URL-адреса о том, что люди проверяют мой узел / экспресс-сайт? - PullRequest
2 голосов
/ 22 октября 2019

Я регистрирую все 404 на моем сайте. Я продолжаю получать их для страниц, на которые у меня нет ссылок, и, очевидно, кто-то (бот) пытается найти страницы администратора / защищенные файлы на моем сайте, такие как /wp-admin.php;

router.get('/wp-admin.php', function(req, res, next) {});

Я пробовал этои он, похоже, не удерживает сервер, он просто выводит что-то вроде этого через минуту:

GET /wp-admin.php - - ms - -

Есть ли какой-либо вред при добавлении маршрутов, таких как тот, где не отправляется ответ, возможно, тратится впустуюих время?

Ответы [ 2 ]

4 голосов
/ 30 октября 2019
router.get('/wp-admin.php', function(req, res, next) {});

Это приведет к превышению времени ожидания и закрытию соединения. Это упростит атаку «Отказ в обслуживании» для хакеров и заклинит ваш сервер узлов. Вы всегда можете использовать некоторые виды ограничителей скорости для предотвращения непрерывного запроса от определенного IP-адреса.

express-rate-limit может использоваться для этого. Это просто экспресс-связующее ПО

0 голосов
/ 01 ноября 2019

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

Я рекомендую пойти еще дальше и разбить эти запросы, используя req.destroy.

Я не уверен в последствиях включения Express, хотя и здесь. Например, тело запроса автоматически читается промежуточным программным обеспечением перед этим обработчиком запросов, который вы показали? Если так, то это будет вектор атаки, который делает митигацию, которую я предлагаю, бесполезной.

Независимо от того, чтобы продемонстрировать то, что я предлагаю с ванильным HTTP-сервером:

var h = require('http')

h.createServer(function(req, res) {
  // tear down the socket as soon as the request event is emitted
  req.destroy()
}).listen(8888, function() {
  // send a request to the server we just created
  var r = h.request({port: 8888})
  r.on('response', console.log.bind(console, 'on_response'))
  r.on('error', console.log.bind(console, 'on_error'))
  r.on('timeout', console.log.bind(console, 'on_timeout'))

  // abort will be emitted to the caller, but nothing else
  r.on('abort', console.log.bind(console, 'on_abort'))
  r.end()
})

Вы могли бытакже вызовите socket.destroy в событии connection HTTP-сервера, если вы можете каким-либо образом идентифицировать вызывающего агента как бота (или чего-то еще).

var h = require('http')

h.createServer(function(req, res) {
  res.send('foo')
}).on('connection', function(socket) {
  // pretend this ip address is the remote address of an attacker, for example
  if (socket.remoteAddress === '10.0.0.0') {
    socket.destroy()
  }
}).listen(8888, function() {
  // send a request to the server we just created
  var r = h.request({port: 8888})
  r.on('response', console.log.bind(console, 'on_response'))
  r.on('error', console.log.bind(console, 'on_error'))
  r.on('timeout', console.log.bind(console, 'on_timeout'))

  // abort will be emitted to the caller, but nothing else
  r.on('abort', console.log.bind(console, 'on_abort'))
  r.end()
})
...