Express.js WebSocket ограничение на количество сообщений

Рейтинг: 0Ответов: 0Опубликовано: 15.07.2023

Пишу игру на 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)
    });
}

Ответы

Ответов пока нет.