Proteja su sitio web de un agujero de seguridad muy común con el manejo CSRF incorporado de Django.
Django es un marco web de Python que puede usar para crear aplicaciones web seguras. Ofrece muchas funciones para ayudar a los desarrolladores con la seguridad. Una de estas características son los tokens CSRF, esenciales para proteger los formularios de los ataques de falsificación de solicitudes entre sitios.
¿Qué es un token CSRF?
Un token CSRF es una función de seguridad que protege las aplicaciones web de Ataques de falsificación de solicitudes entre sitios (CSRF). Permite que el servidor de aplicaciones verifique si el envío de un formulario provino de un navegador auténtico o si un pirata informático lo falsificó.
Los tokens CSRF son entradas de formulario que realizan un seguimiento de una sesión de usuario. un sitio web marco de aplicación web del lado del servidor normalmente genera tokens CSRF para cada sesión de usuario única. El servidor comprueba si el token es correcto cada vez que un usuario envía un formulario. Los tokens CSRF generalmente consisten en cadenas y números aleatorios, lo que hace que sus valores sean impredecibles.
Generación de tokens CSRF en Django
de Django get_token() La función genera aleatoriamente tokens CSRF. Para encontrar esta función, vaya a la csrf.py archivo dentro de su Entorno virtual Python. La estructura de carpetas debería verse así:
env/
└── Libre/
└── paquetes de sitio/
└── Django/
└── software intermedio/
└── csrf.py
Dentro de este archivo, encontrará el get_token() función, que devuelve el token. Usos de Django enmascaramiento de datos para proteger el valor del token de los piratas informáticos.
De forma predeterminada, Django habilita la protección CSRF para su sitio agregando django.middleware.csrf. CsrfViewMiddleware en el MEDIO AMBIENTE lista de tu configuración.py archivo. Todo lo que necesitas hacer es agregar {% csrf_token%} para usted CORREO formularios sin agregar {% csrf_token%}, obtendrás un 403 (prohibido) error al enviar un formulario.
cuando agregas {% csrf_token%} a su formulario, crea automáticamente un campo de entrada oculto con el nombre csrfmiddlewaretoken, que contiene el valor del token CSRF enmascarado. El servidor usa este valor para determinar si el envío del formulario es auténtico. Puede verificar el valor de este campo oculto al ver la fuente de la página o usar la función de herramientas de desarrollo de su navegador.
Cómo funcionan los tokens CSRF en Django
Cuando inicia su sitio con el formulario, Django crea automáticamente un cookie del navegador llamado ficha csrf. Esta cookie realiza un seguimiento de la actividad del usuario en el sitio e identifica de forma única a cada usuario.
Cuando el usuario envía el formulario, el servidor compara el valor de la cookie con el valor de la csrfmiddlewaretoken en el campo de entrada oculto. Si estos valores coinciden, el servidor procesará el formulario con éxito, de lo contrario, generará un error.
A primera vista, los valores de la cookie y la csrfmiddlewaretoken parecen ser diferentes. Esto es intencional y agrega una capa adicional de protección al token CSRF. El token CSRF se compara con la cookie de esta manera:
- El get_token() La función enmascara el token CSRF antes de pasarlo al campo de entrada.
- Cuando se envía el formulario, el token CSRF se desenmascara con la ayuda de la clave secreta en el archivo de configuración.
- El token desenmascarado se compara con la cookie de sesión.
- Si los valores son los mismos, se procesa el formulario. Si no, el servidor devuelve un error.
Para evitar que los piratas informáticos roben su token CSRF, Django lo renueva cada vez que inicia una sesión de usuario.
Creación de tokens CSRF personalizados
Aunque Django facilita la protección de sus formularios simplemente agregando el {% csrf_token%}, también es posible generar tokens CSRF y agregarlos manualmente a sus formularios. Para ello, importa el get_token() función:
de django.middleware.csrf importar obtener_token
En su opinión, puede generar el token CSRF de esta manera:
definitivamentever_nombre(pedido):
csrf_token = get_token (solicitud)# realizar la lógica de vista
contexto = {
"csrf_token": csrf_token
}
devolver hacer (pedir, 'nombre_aplicación/plantilla.html', contexto=contexto)
En su plantilla HTML, puede incluir manualmente su etiqueta de entrada y agregar el csrf_token a ello así:
<formamétodo="CORREO" >
<aportetipo="oculto"nombre="csrfmiddlewaretoken"valor="{{csrf_token}}">
{{formulario.as_p}}
<botóntipo="entregar"clase="btn btn-contorno-secundario">Añadir librobotón>
forma>
Alternativamente, puede generar el campo de entrada oculto desde sus vistas de esta manera:
definitivamentetu_vista(pedido):
csrf_token = get_token (solicitud)
csrf_token_html = ''.formato (csrf_token)# realizar la lógica de vista
contexto = {
"csrf_token": csrf_token_html
}
devolver hacer (pedir, 'nombre_aplicación/plantilla.html', contexto=contexto)
Luego puede agregarlo a su plantilla HTML de esta manera:
<formamétodo="CORREO" >
{{ csrf_token_html|seguro }}
{{formulario.as_p}}
<botóntipo="entregar"clase="btn btn-contorno-secundario">Añadir librobotón>
forma>
Si desea controlar completamente la protección CSRF de su formulario, puede hacerlo comparando su token CSRF con la cookie almacenada en el navegador. Según los resultados de la comparación, puede gestionar el envío del formulario como desee. Aquí hay un ejemplo:
de django.atajos importar prestar
de django.middleware.csrf importar get_token, _unmask_cipher_token
de django.utils.crypto importar tiempo_constante_comparardefinitivamentetu_vista(pedido):
# Generar un token CSRF personalizado
csrf_token = get_token (solicitud)
csrf_cookie = solicitud. COOKIES.obtener('csrftoken')# desenmascarar token csrf
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# Compara las fichas
sino constante_tiempo_comparar (unmasked_csrf_token, csrf_cookie):
# Manejar el caso donde los tokens no coinciden
aprobar
demás:
# Manejar el caso donde los tokens coinciden
aprobar
# Renderizar la plantilla
contexto = {
'csrf_token': csrf_token,
}
devolver hacer (pedir, 'nombre_aplicación/plantilla.html', contexto=contexto)
Este fragmento de código recupera el csrf_cookie del objeto de solicitud HTTP. Luego usa el _unmask_cipher_token() Función para desenmascarar el csrf_token.
Una sentencia condicional compara los valores de los datos recuperados. csrf_cookie y el desenmascarado csrf_token. Esta comparación utiliza el tiempo_constante_comparar Función para proteger contra vulnerabilidades de tiempo. Puede escribir su lógica en función del resultado de la comparación.
Deshabilitar la protección CSRF en Django
Aunque Django hace una provisión predeterminada para la protección CSRF, puede deshabilitarla en su proyecto si lo desea. Hay dos maneras de hacer esto:
- Deshabilitar la protección CSRF en todo su sitio web.
- Deshabilitar la protección CSRF en una vista específica.
Deshabilitar la protección CSRF en todo su sitio web
Para deshabilitar la protección CSRF de Django en su sitio web, simplemente debe eliminar el middleware CSRF de su archivo de configuración. En su archivo de configuración, busque una lista llamada MEDIO AMBIENTE. Dentro de la lista, busca esto:
'django.middleware.csrf. CsrfViewMiddleware',
Una vez que lo encuentre, debe eliminarlo de su código para que la protección CSRF predeterminada de Django lo deshabilite.
Deshabilitar la protección CSRF en una vista específica
Si solo desea deshabilitar la protección CSRF en una vista específica de Django, use el @csrf_exempt decorador. Aquí hay un fragmento de código para demostrar:
de django.views.decorators.csrf importar csrf_exento
@csrf_exempt
definitivamentever_nombre(pedido):
# realizar la lógica de vista
aprobar
El @csrf_exempt decorador es solo uno de varios relacionados con la protección CSRF en Django. Puedes leer sobre el resto en Referencia CSRF de Django.
No deshabilite la protección CSRF en su sitio web
Aunque Django lo hace posible, no se recomienda deshabilitar el mecanismo de protección CSRF integrado de Django. Si lo hace, su sitio será vulnerable a los ataques CSRF y, en última instancia, afectará negativamente a los usuarios de su aplicación.
A menos que sea un desarrollador experimentado que sabe cómo implementar un mecanismo de protección CSRF personalizado, debe trabajar con la alternativa proporcionada por Django.