Proteja seu site de uma brecha de segurança muito comum com o tratamento CSRF integrado do Django.

Django é um framework web Python que você pode usar para construir aplicações web seguras. Ele oferece muitos recursos para ajudar os desenvolvedores com segurança. Um desses recursos são os tokens CSRF, essenciais na proteção de formulários contra ataques de falsificação de solicitação entre sites.

O que é um token CSRF?

Um token CSRF é um recurso de segurança que protege aplicativos da web contra Ataques Cross-Site Request Forgery (CSRF). Ele permite que o servidor de aplicativos verifique se o envio de um formulário veio de um navegador autêntico ou se foi forjado por um hacker.

Os tokens CSRF são entradas de formulário que rastreiam uma sessão do usuário. de um site estrutura de aplicativo da web do lado do servidor normalmente gera tokens CSRF para cada sessão de usuário exclusiva. O servidor verifica se o token está correto sempre que um usuário envia um formulário. Os tokens CSRF geralmente consistem em strings e números aleatórios, tornando seus valores imprevisíveis.

instagram viewer

Geração de token CSRF no Django

Django's get_token() A função gera aleatoriamente tokens CSRF. Para encontrar esta função, navegue até o csrf.py arquivo dentro do seu ambiente virtual Python. A estrutura de pastas deve ficar assim:

env/

└── Lib/

└── pacotes de sites/

└── django/

└── middleware/

└── csrf.py

Dentro deste arquivo, você encontrará o get_token() função, que retorna o token. Django usa mascaramento de dados para proteger o valor do token de hackers.

Por padrão, o Django habilita a proteção CSRF para seu site adicionando django.middleware.csrf. CsrfViewMiddleware no MIDDLEWARE lista do seu settings.py arquivo. Tudo o que você precisa fazer é adicionar {% csrf_token %} para o seu PUBLICAR formulários. Sem adicionar {% csrf_token %}, você vai conseguir um 403 (proibido) erro ao enviar um formulário.

Quando você adiciona {% csrf_token %} ao seu formulário, ele cria automaticamente um campo de entrada oculto com o nome csrfmiddlewaretoken, que contém o valor do token CSRF mascarado. O servidor usa esse valor para determinar se o envio do formulário é autêntico. Você pode verificar o valor desse campo oculto visualizando a fonte da página ou usando o recurso de ferramentas do desenvolvedor do seu navegador.

Como funcionam os tokens CSRF no Django

Quando você inicia seu site com o formulário, o Django cria automaticamente um cookie do navegador chamado csrftoken. Este cookie rastreia a atividade do usuário no site e identifica exclusivamente cada usuário.

Quando o usuário envia o formulário, o servidor compara o valor do cookie com o valor do csrfmiddlewaretoken no campo de entrada oculto. Se esses valores corresponderem, o servidor processará o formulário com êxito, caso contrário, ocorrerá um erro.

À primeira vista, os valores do cookie e do csrfmiddlewaretoken parecem ser diferentes. Isso é intencional e adiciona uma camada extra de proteção ao token CSRF. O token CSRF é comparado ao cookie assim:

  • O get_token() A função mascara o token CSRF antes de passá-lo para o campo de entrada.
  • Quando o formulário é enviado, o token CSRF é desmascarado com a ajuda da chave secreta no arquivo de configurações.
  • O token não mascarado é comparado ao cookie da sessão.
  • Se os valores forem iguais, o formulário será processado. Caso contrário, o servidor retornará um erro.

Para evitar que hackers roubem seu token CSRF, o Django o renova toda vez que inicia uma sessão de usuário.

Criando tokens CSRF personalizados

Embora o Django facilite a proteção de seus formulários simplesmente adicionando o {% csrf_token %}, também é possível gerar tokens CSRF e adicioná-los manualmente aos seus formulários. Para isso, importe o get_token() função:

de django.middleware.csrf importar get_token

Na sua opinião, você pode gerar o token CSRF assim:

defview_name(solicitar):
csrf_token = get_token (pedido)

# executa a lógica de exibição
contexto = {
"csrf_token": csrf_token
}

retornar renderizar (solicitação, 'app_name/template.html', contexto=contexto)

Em seu modelo HTML, você pode incluir manualmente sua tag de entrada e adicionar o csrf_token para ele assim:

<formamétodo="PUBLICAR" >
<entradatipo="escondido"nome="csrfmiddlewaretoken"valor="{{ csrf_token }}">
{{form.as_p}}
<botãotipo="enviar"aula="btn btn-contorno-secundário">Adicionar livrobotão>
forma>

Como alternativa, você pode gerar o campo de entrada oculto a partir de suas visualizações, assim:

defsua visão(solicitar):
csrf_token = get_token (pedido)
csrf_token_html = ''.format (csrf_token)

# executa a lógica de exibição
contexto = {
"csrf_token": csrf_token_html
}

retornar renderizar (solicitação, 'app_name/template.html', contexto=contexto)

Você pode adicioná-lo ao seu modelo HTML assim:

<formamétodo="PUBLICAR" >
{{ csrf_token_html|seguro }}
{{form.as_p}}
<botãotipo="enviar"aula="btn btn-contorno-secundário">Adicionar livrobotão>
forma>

Se você deseja controlar completamente a proteção CSRF do seu formulário, pode fazer isso comparando seu token CSRF com o cookie armazenado no navegador. Com base nos resultados da comparação, você pode manipular o envio do formulário da maneira que desejar. Aqui está um exemplo:

de django.shortcuts importar renderizar
de django.middleware.csrf importar get_token, _unmask_cipher_token
de django.utils.crypto importar constant_time_compare

defsua visão(solicitar):
# Gera um token CSRF personalizado
csrf_token = get_token (pedido)
csrf_cookie = solicitação. COOKIES.get('csrftoken')

# desmascarar token csrf
unmasked_csrf_token = _unmask_cipher_token (csrf_token)

# Compara os tokens
senão constant_time_compare (unmasked_csrf_token, csrf_cookie):
# Lida com o caso em que os tokens não correspondem
passar
outro:
# Lida com o caso em que os tokens correspondem
passar

# Renderiza o modelo
contexto = {
'csrf_token': csrf_token,
}

retornar renderizar (solicitação, 'app_name/template.html', contexto=contexto)

Este trecho de código recupera o csrf_cookie do objeto de solicitação HTTP. Ele então usa o _unmask_cipher_token() função para desmascarar o csrf_token.

Uma instrução condicional compara os valores dos valores recuperados csrf_cookie e o desmascarado csrf_token. Esta comparação usa o constant_time_compare função para proteger contra exploits de temporização. Você pode escrever sua lógica com base no resultado da comparação.

Desativando a proteção CSRF no Django

Embora o Django faça uma provisão padrão para proteção CSRF, você pode desativá-la em seu projeto, se desejar. Existem duas maneiras de fazer isso:

  • Desativando a proteção CSRF em todo o seu site.
  • Desativando a proteção CSRF em uma exibição específica.

Desativando a proteção CSRF em todo o seu site

Para desativar a proteção CSRF do Django em seu site, basta remover o middleware CSRF do seu arquivo de configurações. No seu arquivo de configurações, localize uma lista chamada MIDDLEWARE. Dentro da lista, procure por isso:

'django.middleware.csrf. CsrfViewMiddleware',

Depois de encontrá-lo, você deve removê-lo do seu código para que a proteção CSRF padrão do Django o desabilite.

Desativando a proteção CSRF em uma exibição específica

Se você deseja apenas desabilitar a proteção CSRF em uma visão específica do Django, use o @csrf_exempt decorador. Aqui está um trecho de código para demonstrar:

de django.views.decorators.csrf importar csrf_exempt

@csrf_exempt
defview_name(solicitar):
# executa a lógica de exibição
passar

O @csrf_exempt decorator é apenas um dos vários relacionados à proteção CSRF no Django. Você pode ler sobre o resto em Referência CSRF do Django.

Não desabilite a proteção CSRF em seu site

Embora o Django torne isso possível, desabilitar o mecanismo de proteção CSRF integrado do Django não é recomendado. Fazer isso tornará seu site vulnerável a ataques CSRF e afetará negativamente os usuários de seu aplicativo.

A menos que você seja um desenvolvedor experiente que sabe como implementar um mecanismo de proteção CSRF personalizado, você deve trabalhar com a alternativa fornecida pelo Django.