Express.js WebSocket ограничение на количество сообщений
Пишу игру на Express.js. Соответственно, общение между клиентом и сервером в основном происходит по WebSocket. И сейчас занялся вопросом защиты от намеренных атак со стороны хакеров. Хочу ограничить количество отправленных сообщений, чтобы нельзя было отправить больше 5 сообщений подряд, между каждым из которых разница менее 100 мс. Написал вот такой вот ограничитель:
const checkDdos = (client, clientID, count, lastTime) => {
if (Date.now() - lastTime < 100) {
count += 1
if (count === 5) {
new S_LOGIN_FAILED(
client,
'',
{
success: false,
message: 'Lost connection by many requests per time!',
isServerWorks: false
}
)
client.close()
logger.error(`LOST CONNECTION BY MANY REQUESTS BY TIME: ${clientID}`)
}
console.log(count)
} else {
count = 0
}
lastTime = Date.now()
return {count, lastTime}
}
Все хорошо, он отключает пользователя, но зачастую не через 5 сообщений, а 10, 30, 50 из 1000. Так как сообщения я отправляю в цикле с клиента:
useEffect(()=>{
let i = 0
while (i < 1000){
console.log('DDOS', i)
new C_GET_MISSION_ROAD_MAP()
i++
}
}, [])
Может ли кто-то подсказать, как можно исправить эту задержку в отключении, чтобы отключало пользователя сразу через 5 сообщений и не давало дальше отправлять их?
Дополняю вопрос местом, где использую данную функцию:
module.exports = (wss) => {
wss.on('connection', function (client) {
const clientID = UsersModel.socketConnectionClient(client)
let messageCount = 0
let lastTime = 0
client.on('message', (message) => {
try {
const result = checkDdos(
client, clientID, messageCount, lastTime
)
messageCount = result.count
lastTime = result.lastTime
if (messageCount < 5) {
message = JSON.parse(message)
handlerMessages(client,message)
loginManager.loginHandler(client,message)
if (
UsersModel.getUserData(message.username)
|| message.name === 'C_LOGIN'
|| message.name === 'C_PING'
) {
gamesManager.usersHandler(client,message)
collectionManager.collectionHandler(client,message)
chatManager.chatHandler(client,message)
paramsManager.paramsHandler(client,message)
sevenDaysGiftsManager.sevenDaysGiftsHandler(
client,message
)
roadManager.roadHandler(client,message)
friendsManager.friendsHandler(client,message)
everyDayGiftManager.everyDayGiftManager(
client,message
)
}
}
} catch (error) {
logger.error('Error: ', error)
}
})
client.on('close', function () {
UsersModel.removeClient(clientID,GameModel)
logger.info(`LOST CONNECTION: ${clientID}`)
clearInterval(interval);
});
new S_PONG(client)
interval = setTimeout(()=>{
new S_PONG(client)
},7000)
});
}
Источник: Stack Overflow на русском