Pular para o conteúdo
Todos os conceitos

Controle só no cliente

Esconder um botão ou uma opção no navegador não tranca a rota por trás; o servidor ainda responde.

É comum a interface esconder o que o usuário não deveria usar: o botão "exportar tudo" só aparece para admin, o menu de staff some para o membro comum. Isso é bom para a experiência, mas não é segurança. O código que roda no navegador está nas mãos do usuário: ele vê o código, abre as Ferramentas de Desenvolvedor e, principalmente, pode chamar a rota na mão.

O botão escondido dispara algo como fetch('/api/members/export'). Se o servidor não checa o papel nessa rota, qualquer um faz o mesmo pedido com curl e recebe a resposta, botão ou não:

curl https://portal.querencia.test/api/members/export

A regra: o navegador decide o que mostrar; o servidor decide o que permitir. Esconder um controle no cliente é enfeite por cima de uma checagem que tem que existir no servidor. Em Python, é o erro de controlar só o template ({% if is_admin %}) e deixar a view sem @admin_required.

Cliente (navegador) botão escondido só decide o que mostrar curl /api/members/export Servidor rota sem checagem de papel responde a qualquer um pedido feito na mão
O navegador esconde o botão para o membro, mas a rota /api/members/export responde ao mesmo pedido feito na mão: o controle estava só no cliente.

Aparece nestes desafios