Как отмечалось в уже принятом ответе, подобный экспресс-маршрут сделает вас уязвимыми.
Я рекомендую пойти еще дальше и разбить эти запросы, используя 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()
})