Hamabronks

Segurança na web

(ou pequenos deslizes a gente comete)

Já diziam por ai: Segurança na web é igual jovens fazendo sexo. Todos mentem que fazem. E os que fazem, fazem errado.

Mentira. Mesmo porque segurança na web é algo bem difícil de se fazer bem. E nem podemos culpar somente os desenvolvedores. Mas às vezes o usuário vai fazer algo que comprometerá todo seu sistema, como naquela anedota do usuário que não podia copiar a senha por motivos de segurança. Ele tirou print dela e a enviou por email.

Mesmo que você não guarde suas senhas em plain text (Just don’t!), algumas coisas passam despercebidas. Afinal, dev também é gente. Ontem eu fui fazer meu credenciamento no evento BrazilJS e a credencial é um QRCode. (❤ QRCode)

Como eu acessei do pc, resolvi salvar o QRCode e mandar pro celular. Por força do hábito dei um inspect no QRCode e…

Olha! Meu QRCode é o número 900… Será que esse é meu código? Resolvi escanear o QRCode pra ver o que ele me trazia e esse são os dados:

***Daniel Oshiro|daniel0oshiro@gmail.com|900|3|5|756|0|active
**# (Nome Sobrenome | email | id | ? | ? | ? | ? | status)*

Mas esse ID 900 me incomodou, resolvi testar o ID 899, então acessei a url:https://braziljs.org/api/1.0/attendee/qr/899/ e:

***Mateus Andrade|mateus@gmail.com|899|3|5|756|0|active***

Tenho os dados do Mateus, colega aqui do trabalho que vai no evento também. O ID 001 é do Felipe (você também é o “Felipe 2”?). O 2927 é do Leonardo (se quiser tomar uma cerveja Leo, manda um torpedo).

E se eu fizer uma lista das URL’s e baixar todos os QR?

$ wget -i urls.txt

E se eu criar um script pra ler todos os QRCode e colocar os dados em um outro .txt?

const Jimp = require("jimp");
const fs = require("fs");
const jsQR = require("jsqr");

const codesLocation = __dirname + "/codes/"

fs.readdirSync(codesLocation).forEach(file => {
  const buffer = fs.readFileSync(codesLocation + file);

  Jimp.read(buffer, function(err, image) {
    if (err) throw err;

    const code = jsQR(
      image.bitmap.data,
      image.bitmap.width,
      image.bitmap.height
    );

    if (code) {
      const location = __dirname + "/attendee.txt"
      const data = code.data + "\r\n"
      fs.appendFile(location, data, function(err) {
        if (err) throw err;
      });
    }
  });
});

Mesmo que sejam “só” o nome completo e email, ainda pode ser usado para spam, etc. E afinal de conta, são seus dados, né? Isso podia ter sido evitado com o uso de UUID/GUID ao invés de id sequencial. Não use id’s senquenciais. Autentique seus end-point. E cuidar da privacidade dos seus usuários.

Hoje segurança e privacidade na web já não é opcional e devemos tomar cuidado com isso. Com a democratização da web, muito mais pessoas produzem para web e aparece mais falhas. Só em 2018 ocorreram dezenas de vazamentos. Você pode até mesmo checar se seus dados vazaram algum dia, nesse site: https://haveibeenpwned.com/.

Sem contar de casos como os quizzes do Facebook, onde talvez nem nós mesmo damos valor aos nossos dados. Que são sim muito valiosos. De qualquer forma, cuide de suas senhas e utilize autenticação em dois fatores. E surfe em segurança na rede mundial de computadores. (desculpa ai, sou velho)

Ah! Caso você queira “exploitar” isso… Bom, procure outra porta.

Agora pra você pegar o QR precisa também de hash:

https://braziljs.org/api/1.0/attendee/qr/900/a6155051cc1144ceb89632dbe7f998ab.

Pronto, nosso dados estão a salvo. :)

Um salve para a Andreza e Jaydson (e qualquer outro envolvido) na correção da falha. o/

Declaro que nenhum dev foi ferido na criação desse post. Não garantimos porém que nenhum deles precisou trabalhar até mais tarde ou fazer testes em produção.