Executando verificação de segurança...
33

Como ganhei um carro por causa de um código mal escrito

Vou contar uma história que aconteceu comigo mas que por questões legais nunca pude expor, e por essas mesmas questões legais irei ocultar alguns detalhes.

O ano era 2013, e nesta época eu desenvolvia sites e sistemas baseados em PHP, Laravel, jQuery. Certo dia estavamos navegando no facebook e um colega mostrou uma promoção de uma montadora X, que prometia dar um carro (na época na faixa de 50 mil reais) para quem finalizasse um jogo da memoria online no menor tempo.

Fomos todos testar o tal jogo, e o tempo do ranking era relativamente alto. Até que minha mente hacker acendeu. Antes de ir a fundo, fui no regulamento da promoção e nada falava sobre uso de robôs ou nada do tipo, a inocência contida naquele concurso era absurda.

Decidi então desenvolver algo que resolveria o quebra cabeças pra mim. A intenção no fundo nem era ganhar nada, apenas mostrar o quão falho era o jogo e o concurso em si.

O jogo

O jogo era um jogo da memoria, num tabuleiro de 5x5 ou 6x6, não me recordo, onde você tinha que acertar no menor tempo porém num limite de X erros. Havia apenas uma tentativa por pessoa, porém para nossa sorte, bastava digitar um novo CPF gerado em um gerador de cpfs, e liberava novamente para você jogar. A cada nova tentativa, as cartas eram re-embaralhadas.

1ª iteração

A ideia primeira iteração era simplesmente fazer um "força bruta", que clicava nos cards e anotava sua posição, para posteriormente ir clicando no correto.

Havia um LEVE esforço do desenvolvedor em bloquear esse tipo de tentativa, pois o ID das imagens, e sua url mudavam a cada carregamento. Para resolver isso, usei canvas para comparar as imagens.

Com este codigo consegui um tempo já bastante razoável, após algumas melhorias para ser mais rápido ficamos em 1º no ranking.

Só que: tinha mais alguem tentando isso! Começamos a cair no ranking, e o tempo desse alguém começava a cair assustadoramente, e esse meu código ja não conseguia atingir tal tempo, pois a cada clique uma nova imagem era carregada, e portanto a lentidão da internet tornava o tempo limitado.

2º iteração

Parei então para ler o código que estava minificado (porém não tanto), e percebi então que as respostas vinham junto do código, e tudo o que eu tinha que fazer era esperar carregar o jogo, ler as respostas no código fonte e executar o script que clicaria nas respostas.

Isso derrubou o tempo para um tempo beeem baixo, mas mesmo assim o concorrente acabou num determinado momento baixando desse tempo, e a coisa ficou pessoal.

3ª iteração

Passei então a tirar o site em si da jogada, entendendo ja o fluxo de rede do jogo e já estava trabalhando direto com HTTP, onde logo que o script carregava, eu tinha as respostas e só simulava o trabalho do frontend enviando diretamente as requisições.

Dessa forma, o tempo se resumiu a segundos, e o unico fator limitante era a latencia da rede até o servidor. Consegui a vitória.

A vitoria

Quando o sangue esfriou, percebi que era real, mas bateu o frio na barriga sobre a legalidade daquilo, mesmo tendo lido o regulamento. No final das contas, houve uma disputa judicial, ironicamente entre a outra pessoa que estava "disputando" comigo, porém não foi reconhecido nenhuma irregularidade e o prêmio foi entregue quase dois anos depois, um carro zero foi entregue.

A lição

Como desenvolvedor, aquilo me abriu os olhos como nosso código pode ser responsável por um grande problema caso seja mal elaborado.

Um concurso como este jamais deveria existir da forma que foi feito, e nem sei se há uma forma totalmente segura de fazer tal jogo da memória valendo algo nos tempos de hoje, tendo em vista o machine learning amplamente disponível e fácil de usar, porém se eu fosse chamado para faze-lo, eu tomaria os seguintes cuidados:

  1. Processamento TOTALMENTE no back-end, se possível geraria a imagem no back-end, o front-end seria responsável apenas por enviar a coordenada do clique
  2. Exigência de cadastro válido (email e numero de telefone autenticados, CPF válido)
  3. Rate limiting por IP
  4. Fingerprinting no dispositivo que fez cada tentativa para posterior uso em caso de questionamentos
  5. Regulamento proibindo tentativas não humanas, inclusive estipulando um tempo mínimo para execução (calculando o razoável para um ser humano resolver), invalidando assim tentativas abaixo deste tempo.

Depois disso ainda encontrei outros concursos parecidos que podiam ser resolvidos desta forma, mas a maioria deles no regulamento especificava que não era permitido uso de robôs ou multiplas tentativas pela mesma pessoa, então fiquei eticamente com o pé atrás, afinal eu já havia provado meu ponto, e sido bem remunerado por isso.

E é isso galera, queria ouvir de vocês o que acham, se já passaram por algo parecido, se ja desenvolveram algo do tipo ou já perceberam essas vulnerabilidades em outros concursos.

Carregando publicação patrocinada...
2
2
2
2

Algumas dúvidas que acredito que você possa esclarecer.

Ué, mas o código de defesa do consumidor é pautado pela boa fé. Então em teoria tu não poderia ter ganho o concurso visto que agiu de má fé (Porque a montadora esperava que um único CPF jogasse)(Só não sei se aplica pra concurso). Não foi comentado sobre isso na disputa ?

Outra coisa que achei estranho, acho que vc pode explicar melhor, é o lance do CPF. Se você usou CPF gerados aleatóriamente para isso, o prêmio não estaria vinculado ao CPF que conseguiu o menor tempo ? Por mais que você estivesse experimentando antes de usar o seu CPF, como garantir que seu CPF iria ficar em primeiro lugar já que ia depender da latência no final das contas ?

2

Não haviam como provar que não foi uma tentativa humana além do tempo muito baixo, porém a contraparte (não era a montadora, e sim outro competidor) também tinha um tempo absurdamente baixo vinculado ao seu resultado, então ele não podia alegar algo que ele mesmo fez também.

Além do mais não há uma relação de consumo aqui, portanto o CDC não se aplica.

A montadora não quis contestar o concurso uma vez que isso implicaria em ela assumir que havia uma falha, e pagar a indenização pedida pela pessoa.

Não posso responder sobre o CPF, rs.

1
1

Sei não em, concurso valendo um carro que é só colocar cpf e pronto, o que acho que aconteceu é que tu recebeu um sms falando que ganhou um carro, clicou, caiu no golpe e se inspirou pra inventar essa história.

5

Não é só colocar um CPF, mas o cpf é o identificador único, afinal um nome pode se repetir. Se preferir acredite na sua versão. A moral da história é a mesma, não seja um dev ruim! :-)