Para aprovechar la protección contra ataques CSRF en tus vistas, sigue estos pasos:
El middleware de CSRF está activado por defecto en el MIDDLEWARE configuración. Si sobreescribes esa configuración, recuerda que 'django.middleware.csrf.CsrfViewMiddleware' debe venir antes de cualquier middleware de vista que asuma que los ataques CSRF han sido resueltos.
Si lo has desactivado, lo cual no se recomienda, puedes utilizar csrf_protect() en vistas particulares que quieras proteger (ver más abajo).
En cualquier plantilla que utilice un formulario POST, utiliza el csrf_token etiqueta dentro del elemento <form> si el formulario es para una URL interna, por ejemplo:
<form method="post">{% csrf_token %}
No debes hacer esto con formularios POST que apunten a URLs externas, ya que eso causaría que se filtrara el token CSRF, lo que llevaría a una vulnerabilidad.
En las funciones de vistas correspondientes, asegúrate de utilizar RequestContext para renderizar la respuesta para que {% csrf_token %} funcione correctamente. Si estás utilizando la función render(), vistas genericas o aplicaciones contribuyentes, ya estás cubierto ya que estas todas utilizan RequestContext.
Si bien el método anterior se puede utilizar para solicitudes POST de AJAX, tiene algunas inconveniencias: debes recordar pasar el token CSRF como datos POST en cada solicitud POST. Por esta razón, hay un método alternativo: en cada XMLHttpRequest, establece una cabecera personalizada X-CSRFToken (como especifica la CSRF_HEADER_NAME configuración) con el valor del token CSRF. Esto a menudo es más fácil porque muchas bibliotecas de JavaScript proporcionan hooks que permiten establecer cabeceras en cada solicitud.
Primero, debes obtener el token CSRF. Cómo hacerlo depende de si las configuraciones CSRF_USE_SESSIONS y CSRF_COOKIE_HTTPONLY están habilitadas o no.
Finalmente, necesitarás configurar el encabezado en tu solicitud AJAX utilizando la API fetch().
const request = new Request(
/* URL */,
{
method: 'POST',
headers: {'X-CSRFToken': csrftoken},
mode: 'same-origin' // Do not send CSRF token to another domain.
}
);
fetch(request).then(function(response) {
// ...
});
El backend de plantillas Jinja2 de Django (Jinja2) agrega {{ csrf_input }} al contexto de todas las plantillas, lo que es equivalente a {% csrf_token %} en el lenguaje de plantillas de Django. Por ejemplo:
<form method="post">{{ csrf_input }}
En lugar de agregar CsrfViewMiddleware como protección general, puedes utilizar el decorador csrf_protect(), que tiene la misma funcionalidad exacta, en vistas particulares que necesitan la protección. Debe usarse ambos en vistas que insertan el token CSRF en la salida y en aquellas que aceptan los datos de formulario POST. (Estas son a menudo la misma función de vista, pero no siempre).
El uso del decorador por sí solo no se recomienda, ya que si lo olvidas, tendrás una brecha de seguridad. La estrategia «correa y broches» de usar ambos es aceptable y conlleva un overhead mínimo.
Por defecto, se envía una respuesta “403 Forbidden” al usuario si la solicitud entrante falla las comprobaciones realizadas por CsrfViewMiddleware. Esto debería verse solo cuando hay una genuina Cross Site Request Forgery o cuando, debido a un error de programación, el token CSRF no ha sido incluido con un formulario POST.
La página de errores, sin embargo, no es muy amigable, por lo que podrías querer proporcionar tu propia vista para manejar esta condición. Para hacer esto, configura la CSRF_FAILURE_VIEW configuración.
Los fallos CSRF se registran como advertencias en el logger django.security.csrf.
Si se utiliza el etiqueta de plantilla csrf_token (o si se llama la función get_token de alguna otra manera), CsrfViewMiddleware agregará una cookie y un encabezado Vary: Cookie a la respuesta. Esto significa que el middleware funcionará bien con el middleware de caché si se utiliza como se indica (UpdateCacheMiddleware debe ir antes que cualquier otro middleware).
Sin embargo, si utilizas decoradores de caché en vistas individuales, el middleware CSRF no habrá podido aún establecer el encabezado Vary o la cookie CSRF, y la respuesta será cacheada sin ninguno. En este caso, en cualquier vista que requiera un token CSRF para ser insertado debes utilizar el decorador django.views.decorators.csrf.csrf_protect() primero:
from django.views.decorators.cache import cache_page
from django.views.decorators.csrf import csrf_protect
@cache_page(60 * 15)
@csrf_protect
def my_view(request): ...
Si estás utilizando vistas basadas en clases, puedes referirte a Decorating class-based views.
El CsrfViewMiddleware suele ser un gran obstáculo para las pruebas de funciones de vistas, debido a la necesidad del token CSRF que debe ser enviado con cada solicitud POST. Por esta razón, el cliente HTTP de Django para pruebas ha sido modificado para establecer una bandera en las solicitudes que relaja al middleware y al decorador csrf_protect para que ya no rechacen las solicitudes. En todos los demás aspectos (por ejemplo, enviar cookies, etc.), se comportan igual.
Si, por alguna razón, quieres que el cliente de pruebas realice comprobaciones CSRF, puedes crear una instancia del cliente de pruebas que impone comprobaciones CSRF:
>>> from django.test import Client
>>> csrf_client = Client(enforce_csrf_checks=True)
Algunas vistas pueden tener requisitos inusuales que significan que no se ajustan al patrón normal previsto aquí. Un número de utilidades puede ser útil en estas situaciones. Los escenarios en los que podrían ser necesarias se describen en la siguiente sección.
Los textos traducidos manteniendo todas sus etiquetas intactas son:
Solución: en lugar de deshabilitar el middleware y aplicar csrf_protect a todas las vistas que lo necesitan, active el middleware y utilice csrf_exempt().
CsrfViewMiddleware.process_view() no se utiliza¶Hay casos en los que CsrfViewMiddleware.process_view puede no haber corrido antes de ejecutar tu vista - 404 y 500 maneadores, por ejemplo - pero todavía necesitas el token CSRF en un formulario.
Solución: utilice requires_csrf_token()
Es posible que haya algunas vistas que estén desprotegidas y hayan sido eximidas por csrf_exempt, pero todavía necesitan incluir el token CSRF.
Solución: utilice csrf_exempt() seguido de requires_csrf_token(). (es decir, requires_csrf_token debe ser el decorador más interno).
Una vista necesita protección CSRF bajo un conjunto de condiciones únicamente y no debe tenerla en el resto del tiempo.
Solución: utilice csrf_exempt() para la función de vista completa, y csrf_protect() para el camino dentro de ella que necesita protección. Ejemplo:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_exempt
def my_view(request):
@csrf_protect
def protected_path(request):
do_something()
if some_condition():
return protected_path(request)
else:
do_something_else()
Una página realiza una solicitud POST mediante AJAX, y la página no tiene un formulario HTML con un csrf_token que causaría que se envíe el cookie CSRF requerido.
Solución: utilice ensure_csrf_cookie() en la vista que envía la página.
Dado que es posible que el desarrollador desactive el CsrfViewMiddleware, todas las vistas relevantes en contrib apps utilizan el decorador csrf_protect para asegurar la seguridad de estas aplicaciones contra CSRF. Se recomienda a los desarrolladores de otras aplicaciones reutilizables que quieran las mismas garantías que también utilicen el decorador csrf_protect en sus vistas.
may 31, 2026