Repository navigation
csrf
Home > Servir site e arquivos > Proteção CSRF 🚧
Important
Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.
Vale para a 2.0 · Nível: intermediário
Em uma frase: o TRALCSRFPlugin recusa com 403 todo pedido que altera estado e não
traz o token do próprio cookie, impedindo que outro site use a sessão do seu usuário.
Você vai precisar: RALModuleWebPackage, um TRALWebModule (para amarrar o token à sessão).
Double-submit: o token vai num cookie (ral_csrf, legível por scripts) e a página o
devolve no cabeçalho ou no campo do formulário. O token é assinado com HMAC-SHA256 de
Secret e, com WebModule ligado, amarrado à sessão: token de outra sessão é recusado.
Só métodos que alteram estado são checados (não GET, HEAD, OPTIONS, TRACE, QUERY).
Um Origin/Referer de outro site fora de AllowedOrigins também é recusado.
uses RALCSRF;
Csrf := TRALCSRFPlugin.Create(Self);
Csrf.Server := Servidor;
Csrf.WebModule := Web;
Csrf.Secret := 'segredo-longo';
Csrf.ExcludePaths.Add('/api/*'); // herdado de TRALPluginNum modelo de visão, csrf_token e csrf_field já existem:
<form method="post" action="/clientes">
{{{csrf_field}}} <!-- <input type="hidden" name="_csrf" value="..."> -->
...
</form>
<body hx-headers='{"X-CSRF-Token": "{{csrf_token}}"}'>Em código: Csrf.Token(ARequest, AResponse) e Csrf.FieldHTML(ARequest, AResponse).
| propriedade | padrão | |
|---|---|---|
Secret |
vazio | chave do HMAC. Vazio usa uma aleatória do processo: tokens morrem com ele; atrás de balanceador, todos precisam do mesmo |
WebModule |
nil | amarra o token à sessão |
HeaderName |
X-CSRF-Token |
cabeçalho aceito |
FieldName |
_csrf |
campo de formulário aceito |
CookieName |
ral_csrf |
cookie do token (sem HttpOnly, de propósito) |
AllowedOrigins |
vazio | origens esquema://host[:porta] de outros sites autorizados |
SkipBearer |
True |
deixa passar Authorization: Bearer (navegador não o envia sozinho) |
IncludePaths/ExcludePaths
|
limitam o plugin (herdados) |
Prioridade 650: depois do CORS, antes da autenticação. Recusa: 403 problem+json.
| o que acontece | causa | o que fazer |
|---|---|---|
| 403 em todo POST de API | o plugin cobre a API de tokens/JSON |
ExcludePaths ou SkipBearer
|
| 403 após reiniciar |
Secret vazio |
defina um Secret fixo |
| 403 após login | a sessão mudou (RegenerateSession) e o token estava amarrado à antiga |
gere a página de novo depois do login |
| 403 vindo de outro domínio seu |
Origin diferente |
AllowedOrigins |
Começar
Servidor
- Rotas e parâmetros
- Rotas avançadas: tipos, grupos, versões 🚧
- Ler o pedido e responder
- Objetos no corpo 🚧
- Resposta em fluxo 🚧
- Plugins 🚧
- Serviços (contêiner de dependências) 🚧
- Barramento de eventos 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- JSON-RPC 2.0 🚧
- Servidor MCP (IA) 🚧
-
Protocol Buffers 🚧
- gRPC 🚧
- WebSocket 🚧
- Hubs (WebSocket) 🚧
- Swagger e Postman
- Servidor SOAP 🚧
- WS-Security 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
- Testes em memória 🚧
MQTT 🚧
- O que é e quando usar 🚧
- Cliente MQTT 🚧
- Broker MQTT 🚧
- MQTT-SN 🚧
- Ponte REST 🚧
- Segurança 🚧
- Rede ruim 🚧
E-mail 🚧
- Mensagens 🚧
- Enviar 🚧
- Receber 🚧
- Ler a caixa postal 🚧
- Verificar o que chega 🚧
- Servir caixas postais 🚧
- S/MIME 🚧
- OpenPGP 🚧
Chatbot 🚧
- O robô e os canais 🚧
- Telegram 🚧
- Gateways REST (WhatsApp não oficial) 🚧
- Discord 🚧
- Slack 🚧
- Microsoft Teams 🚧
- Conversa em etapas 🚧
Cliente
Motores
- Qual motor escolher?
- Compatibilidade
- Recursos
- QUIC
- Motor NgHttp2 (HTTP/2) 🚧
- Motor XSocket 🚧
- Motor AdvancedHTTP (experimental) 🚧
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar