not missing incorrect forbidden disable csrfmiddlewaretoken csrf_token cookie django security amazon-s3 django-forms django-csrf

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.