Compreender o conceito
Autenticar uma sessão identifica o utilizador, mas cada operação ainda precisa de autorização. Um ID recebido pela URL não prova propriedade. Consulta ou verifica o recurso com o contexto do utilizador autenticado. Validar o token CSRF ajuda a proteger ações contra pedidos indevidos de outra origem, mas não substitui autorização.
Aplicar e decidir
Cookies de sessão devem usar atributos apropriados ao transporte e contexto. Após uma mudança de autenticação, gere a sessão segundo as recomendações do framework/PHP para reduzir fixação. Trata password hashing com as APIs adequadas. Escapar HTML, parametrizar SQL e validar autorização resolvem riscos diferentes: aplicar um deles não dispensa os outros.
Aplicação guiada no trabalho
Uma sessão identifica a conta, mas cada leitura ou alteração ainda deve aplicar a política do recurso. Inclui listas, exportações e contagens, para não enviar dados de outras contas e escondê-los apenas no browser. Um token CSRF válido não concede propriedade. Cookies também têm funções distintas: HttpOnly limita acesso por APIs de script, Secure restringe o envio a transporte seguro e SameSite contribui para controlar contextos de envio. Não trates um atributo como substituto dos restantes controlos. Após autenticação ou mudança de privilégio, segue o protocolo de renovação de sessão do framework/PHP e considera pedidos concorrentes e expiração. Uma renovação mal coordenada pode interromper utilizadores legítimos. Os exercícios são aplicações de princípios públicos, não uma política interna de qualquer banco.
/invoice?id=52 deve verificar se o utilizador pode aceder à fatura 52. Esconder a ligação na interface não protege o endpoint.
Armadilhas comuns
Autorizar só no browser; ignorar agregados; tratar CSRF ou HttpOnly como autorização.
Tópicos relacionados: Tipos e comparações explícitas · Arrays e funções com intenção
Acesso autorizado deve ser imposto no servidor em cada operação.
Referência: OWASP: Authorization · PHP 8.5 reference; DR PHP 2026.3; new fixtures executed on PHP 8.4.4 / SQLite 3.51.2