Segurança
Atualizada em 15 de agosto de 2026.
Por que esta página existe
- Um diário alimentar diz muito sobre a vida de alguém: a que horas come, quando pula refeição, quando some por uma semana.
- "Levamos sua segurança a sério" não é informação. Aqui vai o mecanismo de cada item, pra você julgar em vez de acreditar.
- E vai também o que ainda falta. Página de segurança que só tem boa notícia não está sendo honesta.
Sua senha
Ela não é guardada. O que vai pro banco é um hash
scrypt com um sal diferente pra cada pessoa. Nem lendo o
arquivo do banco dá pra descobrir a senha de alguém.
scrypt de propósito, e não SHA: hash rápido é justamente
o que permitiria testar bilhões de senhas por segundo se o banco
vazasse. Este é lento e come memória por decisão.
Errar o login responde exatamente igual pra e-mail
que não existe e pra senha errada — e gasta o mesmo tempo, rodando um
scrypt à toa no caso do e-mail inexistente. Diferenciar
transformaria a tela de login num detector de quem tem conta aqui, e
num app de caloria isso é informação sobre a vida das pessoas.
Sua sessão
A sessão é uma linha no banco, não um cookie autossuficiente. O cookie carrega só o identificador dela mais uma assinatura.
A diferença aparece na hora de sair: sair apaga a linha, então um cookie copiado morre na hora. A primeira versão disto era só um cookie assinado, e ali sair não revogava nada — quem tivesse o cookie continuava dentro por 30 dias.
-
O cookie é
HttpOnly: o JavaScript da página não consegue lê-lo. Token guardado emlocalStorageé o primeiro alvo de qualquer XSS. -
Em produção ele usa o prefixo
__Host-, que o navegador só aceita comSecure,Path=/e semDomain. Isso impede um subdomínio invadido de escrever sessão pro domínio principal. - Trocar a senha derruba os outros aparelhos. E existe "Sair de todos os aparelhos" pra quando você desconfiar de algo.
Seu histórico
O identificador do usuário entra em toda consulta, inclusive nas de apagar e atualizar. O identificador de uma refeição nunca é autorização por si só: saber o número de uma refeição não abre a refeição de outra pessoa.
Quem administra o serviço nunca vê o que você comeu. Não existe tela que abra o diário de alguém: o painel conta quantas refeições você registrou e em que dia foi a última, e o ranking de pratos mais fotografados é somado de todo mundo junto, sem dono.
O que ele vê é a lista de contas: e-mail, nome, quando se cadastrou, quantas refeições tem e se assina. Isso existe porque há coisas que só dá pra fazer apontando pra uma pessoa — liberar acesso de cortesia, gerar um link de recuperação pra quem pediu ajuda por e-mail, e encerrar uma conta que abusou.
Seu pagamento
O número do cartão é digitado dentro do Stripe e nunca passa por este servidor. O que fica aqui é o identificador de cliente e a situação da assinatura.
O aviso que o Stripe manda quando um pagamento acontece é conferido por assinatura criptográfica sobre o corpo original da mensagem, e cada aviso só é aplicado uma vez — o Stripe reenvia o mesmo evento por até 72 horas, e sem isso um pagamento poderia ser contado duas vezes.
Sua foto
Ela é reduzida no seu próprio celular antes de subir, enviada ao Google pra análise, e não é escrita em disco nenhum. O que sobra é a lista de alimentos em texto.
A chave da API do Google fica só no servidor. Ela nunca é embutida no aplicativo, nunca vai num cabeçalho montado pelo navegador e nunca aparece no código que chega até você.
O servidor
- Política de conteúdo por hash. As páginas soltas publicam o hash exato de cada bloco que têm dentro, em vez de liberar script embutido em geral. É o que impede que texto vindo de fora vire código executando no seu navegador.
-
Origem conferida em toda escrita, além do
SameSitedo cookie. É a segunda tranca contra um site de terceiro conseguir agir em nome da sua sessão. - Limite de tamanho por rota. Corpo grande só na rota que recebe foto; todo o resto aceita muito pouco. Limite grande na tela de login é ataque barato de indisponibilidade.
- Limite de tentativas por IP e por e-mail, em contadores separados, pra que atacar de vários lugares ao mesmo tempo não escape do teto.
- HTTPS obrigatório em produção, com HSTS de dois anos.
- O registro de eventos não leva e-mail, só o número da conta. Log vai pra serviço de terceiro, fica meses em disco e é lido por quem faz suporte.
Recuperar a senha
O banco guarda o hash do código, nunca o código — banco vazado não vira acesso. O link vale 1 hora e uma vez só, e redefinir a senha derruba todas as sessões abertas.
Pedir o link responde igual pra e-mail que existe e pra e-mail que não existe, pela mesma razão do login. E há um teto de pedidos em aberto por conta: sem isso, a tela viraria uma forma de encher a caixa de entrada de alguém em nome do app.
O que ainda falta
Esta parte é o motivo de a página valer alguma coisa. Nada aqui é segredo, e nada aqui é desculpa.
- Verificação em duas etapas. Não existe ainda. Hoje a proteção da conta é a força da sua senha mais o limite de tentativas.
- Confirmação de e-mail no cadastro. Não existe ainda. Dá pra criar conta com um endereço que não é seu.
- Auditoria externa. Nunca houve. O que está escrito aqui é verificável no código, mas não foi conferido por terceiro.
- Time de plantão. Não existe. O Noprato é operado por uma pessoa só.
Achou uma falha? Escreva pra noprato.app@gmail.com com o que você encontrou e como reproduzir. Não há programa de recompensa, mas há resposta — e o conserto vem antes de qualquer outra coisa na fila.
O pedido é só um: não teste em conta que não é sua, e não baixe dado de outras pessoas pra provar que dá.