filipedeschamps / tabnews.com.br

Conteúdos para quem trabalha com Programação e Tecnologia.
https://tabnews.com.br
GNU General Public License v3.0
5.32k stars 388 forks source link

Sistema de Auditoria e Métricas (versão `beta`) #351

Closed filipedeschamps closed 2 years ago

filipedeschamps commented 2 years ago

Contexto

Primeiro gostaria de referenciar a issue #237 onde é discutido várias alternativas de como fazer um sistema de registro de eventos. Lá, destacam o uso do jsonb para guardar um objeto de evento, que pode mudar sua estrutura de um evento para o outro. Então a idéia é poder registrar qualquer tipo de "ação" dentro do TabNews, por exemplo:

  1. userA creditou 2 tabcoins no userB.
  2. userC foi registrado
  3. userC criou um content com id=xxxxx
  4. userC ganhou 5 tabcoins por ter publicado o content_id=xxxxx

Por aí vai...

E independente de como isso for executado, uma regra precisa ser respeitada: todos esses dados estarão públicos eventualmente.

Execução

Destaquei a última frase, pois precisaremos anotar o ip originador desse evento e isso não pode ser disponibilizado de forma pública. Mas precisamos desse dado para num futuro poder tentar identificar que o userA e o userB são a mesma pessoa e estão trocando tabcoins entre sí de uma forma estranha. Isso não é a prova de balas e inclusive pode gerar falsos positivos, como o @tembra apontou em outra issue sobre na casa dele ter 2 usuários autênticos do TabNews. Mas, é um dado que pode revelar um vacilo de um atacante tentando explorar algo nas tabcoins ou conectar e tornar mais moroso esconder outras movimentações no site.

Mas a dúvida é, como fazer isso? Como guardar o ip, sem revelar ele? Podemos definir uma chave longa e fixa como variável de ambiente, concatenar isso ao ip e fazer um hash? Pois daí podemos comparar os hashes entre as movimentações.

De qualquer forma, nesta primeira versão, não vamos nos preocupar em disponibilizar um endpoint público. Vamos nos focar em ter esse mecanismo pronto para ter registrado todos os movimentos relacionados aos tabcoins (por exemplo, criação, crédito e débito).

ViniciusLima commented 2 years ago

E no caso da pessoa criar 2 contas, uma pela operadora móvel e outra pelo provedor local? E se ela tiver 03 linhas telefônicas com plano de dados cada? Cria mais uma conta no trampo, etc... Acredito que não só o IP mas um identificador do dispositivo possa também ser utilizado para identificar esse tipo de situação, tipo o MAC por exemplo.

No caso do @tembra até quando esse troca troca de tabcoins entre usuários da mesma rede/MAC é viável? Por que se eles usam em dispositivos diferentes, mesmo na mesma rede, não há um problema de imediato, subtende-se que são 02 users separados, mas se for com mesmo IP e MAC aí o alerta deve ser dado.

filipedeschamps commented 2 years ago

Show @ViniciusLima vão ter todos os casos imagino. Mas quando você diz MAC, você se refere ao MAC address, correto? É uma informação show, mas mais passível a ser burlada que o IP de saída, fora que você não consegue capturar essa informação pelo navegador.

escote commented 2 years ago

@ViniciusLima blz? O endereço MAC não consegue ser capturado na API, pois ele está em uma camada muito baixa (camada física). A informação é modificada assim que passa pelo primeiro NAT. Entendo que o endereço IP está longe de ser perfeito, mas é frequentemente utilizado por diversas empresas em conjunto com o captcha conforme sugestões acima. Só temos q lembrar do IPv6 .

ViniciusLima commented 2 years ago

@filipedeschamps e @escote, eu citei o MAC como exemplo e eu realmente não sabia que não poderia ser capturado. Pensei que poderia ter algo como funciona em mobile.

tembra commented 2 years ago

@ViniciusLima Em mobile só pode ser capturado se tiver um app instalado no dispositivo e com essa permissão. Seria o equivalente a ter uma aplicação desktop (.exe no Windows, por exemplo).

No ambiente web o navegador (que de fato é o que está instalado no dispositivo) não repassa para o site esta informação. Esteja ele (o navegador) rodando em ambiente desktop ou mobile.

filipedeschamps commented 2 years ago

Implementado pelo PR #444 🤝