missing - Django-Fallo en la verificación de CSRF-enviar datos del formulario en el sitio web estático a mi aplicación django
forbidden(csrf token missing or incorrect.) ajax (2)
Mi configuración:
- Un sitio web estático como página de destino servida a través de aws S3 (welcome.midominio.com).
- Una aplicación django (django-1.8 con python 2.7) accesible a través de un subdominio (app.midominio.com).
Me gustaría agregar un formulario de contacto que es parte de mi sitio web estático y que envía la información del formulario de contacto a mi servidor django para ser procesado. No quiero agregar el formulario de contacto como plantilla a mi aplicación django porque estoy usando diferentes hojas de estilo y recursos y no quiero mezclarlos entre los servidores. La vista que procesa los datos del formulario solo agrega estos datos a un correo electrónico y lo envía a una dirección de correo electrónico interna.
Recibo un error de verificación de verificación de 403 csrf porque el formulario no incluye el token csrf.
Ahora podría eximir la vista que recibe la solicitud de la verificación csrf, pero no estoy seguro de qué riesgos de seguridad plantea.
No estoy seguro si no estoy entendiendo los ataques y peligros de csrf o si estoy viendo este problema de la manera incorrecta. Todas mis búsquedas y todas las respuestas a las preguntas relacionadas con django-csrf no me han ayudado hasta ahora.
Aquí están mis preguntas:
- ¿Hay una mejor manera de resolver este problema?
- ¿Puedo usar csrf_exempt sin agregar ningún riesgo de seguridad (por ejemplo, haciendo validaciones adicionales)?
Puede agregar dinámicamente un token CSRF, que es una técnica utilizada para las solicitudes ajax. Desde https://docs.djangoproject.com/en/1.11/ref/csrf/ :
/**
* getCookie gets a cookie called ''name'' in the current session
* @param name name of the cookie to get
* @returns value of the cookie requested, null if not found
*/
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '''') {
var cookies = document.cookie.split('';'');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + ''='')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie(''csrftoken'');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
/**
* When doing posts, deletes, etc. we need to transmit the CSRF cookie for
* the request to go through properly, so add the cookie to all ajax calls
* that need the cookie.
*/
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
A continuación, puede hacer clic en ''Enviar'' en su formulario para publicar los datos del formulario mediante una llamada ajax, seguida de un redireccionamiento a la siguiente página.
Sugeriría pasar por esto y decidir antes de usar csrf_exempt decorator provisto por django para eximir la validación csrf de los formularios.
¿Qué es un token de CSRF? ¿Cuál es su importancia y cómo funciona?
Aunque hoy en día es una buena práctica para usar csrf_token en formularios para una mejor medida de seguridad.