Ciência e Tecnologia

O que são e por que você precisa deles

.

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 de falsificação de solicitação entre sites (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.

MAKEUSEDO VÍDEO DO DIAROLE PARA CONTINUAR COM O CONTEÚDO

Os tokens CSRF são entradas de formulário que rastreiam uma sessão do usuário. A estrutura de aplicativo da Web do lado do servidor de um site geralmente 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.

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 dentro do seu ambiente virtual Python. A estrutura de pastas deve ficar assim:

 env/

└── Lib/

    └── site-packages/

        └── 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.

Página de erro 403 proibida do Django no modo de desenvolvimento

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.

campo de entrada oculto do token csrf adicionado por django

Como funcionam os tokens CSRF no Django

Quando você inicia seu site com o formulário, o Django cria automaticamente um cookie de 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.

o cookie csrf armazenado no armazenamento do navegador

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:

 from django.middleware.csrf import get_token

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

 def view_name(request):
    csrf_token = get_token(request)

    
    context = {
        "csrf_token": csrf_token
    }

    return render(request, 'app_name/template.html', context=context)

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

 <form method="POST" >
    <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
    {{form.as_p}}
    <button type="submit" class="btn btn-outline-secondary">Add Book</button>
</form>

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

 def your_view(request):
    csrf_token = get_token(request)
    csrf_token_html = '<input type="hidden" name="csrfmiddlewaretoken" value="{}" />'.format(csrf_token)

    
    context = {
        "csrf_token": csrf_token_html
    }

    return render(request, 'app_name/template.html', context=context)

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

 <form method="POST" >
    {{ csrf_token_html|safe }}
    {{form.as_p}}
    <button type="submit" class="btn btn-outline-secondary">Add Book</button>
</form>

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:

 from django.shortcuts import render
from django.middleware.csrf import get_token, _unmask_cipher_token
from django.utils.crypto import constant_time_compare

def your_view(request):
    
    csrf_token = get_token(request)
    csrf_cookie = request.COOKIES.get('csrftoken')

    
    unmasked_csrf_token = _unmask_cipher_token(csrf_token)
    
    
    if not constant_time_compare(unmasked_csrf_token, csrf_cookie):
        
        pass
    else:
        
        pass
        
    
    context = {
        'csrf_token': csrf_token,
    }

    return render(request, 'app_name/template.html', context=context)

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 desabilitar 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:

 from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def view_name(request):
    
    pass

O @csrf_exempt decorator é apenas um dos vários relacionados à proteção CSRF no Django. Você pode ler sobre o resto na 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.

.

Mostrar mais

Artigos relacionados

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Botão Voltar ao topo