Com o lançamento de Servidor SmartFox 2.19.0 introduzimos um novo Filtro de inundação de extensão que fornece controle detalhado sobre a taxa de pacotes de solicitações de extensão: pode ser usado para limitar o número de chamadas por segundo para solicitações específicas e definir automaticamente regras para alertar e banir o(s) cliente(s) infrator(es).
Inclui também a capacidade de capturar chamadas de extensão desconhecidas (ou seja, solicitações para as quais não existe um manipulador de solicitações) e aplicar também regras de banimento automático.
Em circunstâncias normais, por exemplo, usuários jogando com o aplicativo cliente oficial, não deve haver preocupação com spam de solicitação: limitações podem ser facilmente codificadas no próprio cliente. No entanto, também é relativamente fácil para usuários maliciosos fazer engenharia reversa em um cliente feito em Javascript, Unity ou Java e contornar tais limitações.
Visão geral
No diagrama abaixo, mostramos uma visão panorâmica do filtro e sua posição na cadeia de invocação da extensão. Para cada manipulador de solicitação definido em nosso código de extensão (por meio do adicionarManipulador de Solicitação métodos) podemos definir um limite expresso em número de chamadas por segundo.
Neste exemplo definimos um jogadorAtirar manipulador de solicitação e também definimos um limite de 4 solicitações/seg. Se um cliente enviar 20 chamadas em apenas um segundo, os primeiros 4 serão passados para a Extensão e processado, enquanto o restante será descartado. Além disso, com base nas regras de auto-ban, o remetente será avisado ou banido.
Uso
O filtro de inundação de extensão é inativo por padrão. Para ativá-lo precisamos chamar o initFloodFilter(…) método disponível na matriz Extensão SFS aula.
public class AntiFloodTestExtension extends SFSExtension { static remaining String PLAYER_SHOOT = "pShoot"; static remaining String PLAYER_MOVE = "pMove"; @Override public void init() { ExtensionFloodFilterConfig cfg = new ExtensionFloodFilterConfig(); cfg.banDurationMinutes = 120; cfg.maxFloodingAttempts = 3; cfg.secondsBeforeBan = 2; cfg.banMessage = "You at the moment are banned. Cause: request flooding."; cfg.filterRules = Map.of ( PLAYER_SHOOT, 4, PLAYER_MOVE, 15 ); initFloodFilter(cfg); addRequestHandler(PLAYER_SHOOT, (sender, param) -> { hint("Taking pictures"); }); addRequestHandler(PLAYER_MOVE, (sender, param) -> { hint("Transferring"); }); } }
O método inicializador leva um ExtensionFloodFilterConfig objeto com diversas propriedades para alertar e banir clientes.
Para mais detalhes sobre cada configuração, valores padrão e mais detalhes, consulte nosso website de documentação aqui.