¿Es inherentemente inseguro buscar contenido HTML y JS del servidor y adjuntarlo a un nodo HTML existente (mientras se ejecutan todos los scripts)?

0

Dos formas de desarrollar una aplicación web: ya sea la forma "clásica", recargando completamente la página con cada solicitud, o la forma "API", es decir, hacer que el servidor solo envíe datos JSON y que el cliente los obtenga por AJAX y reconstruir la página a través de JS.

Estoy pensando en la tercera forma: hacer que el servidor envíe fragmentos HTML, posiblemente con <script> tags en respuesta a cada solicitud, y hacer que el cliente los busque a través de AJAX y los adjunte a los nodos HTML existentes en el documento. Por ejemplo, las instalaciones de inicio de sesión se pueden implementar de esa manera: la ruta login.html del sitio web puede enviar el formulario de inicio de sesión o el botón de cierre de sesión, que el cliente buscará a través de AJAX y se adjuntará a un <div> apropiado. En caso de que el usuario haga clic en el botón de inicio / cierre de sesión, esto será POSTED por la clínica a través de XMLHttpRequest. De esa manera, puedo evitar volver a cargar toda la página sin dejar de utilizar los beneficios del lenguaje de la plantilla del lado del servidor, que, por ejemplo, clasifica automáticamente las formas como los tokens CSRF en los formularios.

Esto significa que el código JS de mi cliente contendrá fragmentos como este:

let xhr = new XMLHttpRequest();
xhr.onload = function () {
    let elt = document.getElementById('toBeInsertedTo');
    elt.innerHTML = "";
    elt.innerHTML = xhr.responseXML.getElementById('toBeInserted').innerHTML;
    // alternatively: elt.appendChild(xhr.responseXML.getElementById('toBeInserted'));
    for (scr of Array.from(elt.getElementsByTagName('script'))) {
        eval(scr.innerHTML);
        // alternatively: new Function(scr.innerHTML)();
    }
}
xhr.open('GET', '@Url.Page("/SomePage")');
xhr.responseType = 'document';
xhr.send();

No puedo ver cómo esto puede ser menos seguro que volver a cargar la página completamente. En ambos casos, todo lo que se recibe del servidor es igualmente confiable.

Pero no puedo ver cómo puede ser inseguro, no significa que no lo sea. Mis dudas se basan en dos cosas:

  1. MDN advierte contra innerHTML y eval . Dicen que estas instalaciones son inseguras. Según ellos, el uso de innerHTML se constituye por su propia razón suficiente para fallar en la mayoría de las auditorías de seguridad, y nunca se debe usar eval . Me imagino que las mismas preocupaciones deberían estar presentes con alternativas a innerHTML like appendChild ing nodes relevantes, ya que esencialmente hacen lo mismo; Cuando se trata de eval , MDN recomienda Function como una alternativa menos mala, pero advierte que es solo un poco más seguro que eval .
  2. Supongo que debe haber una razón por la que no se ejecutan las etiquetas <script> insertadas a través de innerHTML y tengo la sospecha de que esto debe estar relacionado con la seguridad. Puedo forzarlos a que ejecuten ( eval , Function ), pero ¿no estoy descartando las precauciones de seguridad que las personas más sabias que yo implementan por buenas razones que ni siquiera entiendo?

¿Mi diseño es inherentemente inseguro? En caso afirmativo, ¿a qué tipo de ataques es vulnerable?

Si es importante, el backend del lado del servidor es ASP .NET Core.

    
pregunta gaazkam 18.05.2018 - 16:36
fuente

0 respuestas

Lea otras preguntas en las etiquetas