Estoy tratando de reducir las vulnerabilidades en una base de código antigua, específicamente los ataques XSS. El patrón general es:
$.ajax a un archivo PHP que devuelve text/plain JSON sin formato (a través json_encode($data) )$(selector).html , $(selector).append , u ocasionalmente document.getElementById(id).innerHTML =Aquí hay un ejemplo simplificado del flujo de datos: page.html
<head> <script src="script.js"></script> </head> <body> <table id="myTable"></table> </body>guión.js
$.ajax({url: "phpFile.php"}, function(data){ data = JSON.parse(data); $("#myTable tbody").html(data.redcuce(row=>"<tr><td>"+row.text"+</td></tr>", "")) }phpArchivo.php
//database query resulting in $data = [text->'<img src="x" onerror="alert(1)">', text->'Innocent value'] echo json_encode($data); Algunos de los datos recuperados son entradas del usuario, por lo que si un campo contiene <img src="x" onerror="alert(1)"> , se ejecuta cuando se representa en la tabla.
Pasé la siguiente función de desinfección a JSON.parse para desinfectar los datos
const sanitiseJson = (key, value) => typeof value === "string" ? DOMPurify.sanitize(value, { USE_PROFILES: { html: true } }) : value;Esto usa la biblioteca DOMPurify , que sería muy fácil de implementar para mí con buscar y reemplazar.
Según tengo entendido, esto eliminará HTML potencialmente malicioso del objeto JSON. Esto evitará ataques XSS en este escenario.
Editar: tenga en cuenta que soy muy consciente de que .html() etc., no es la forma correcta de insertar datos, pero esta es una base de código grande y antigua (más de 45k líneas) y está muy arraigada, por lo que mi pregunta es más sobre si esto es una solución 'aceptable' en un apuro o si no se acerca
Según mis pruebas limitadas, parece funcionar, y como entiendo (poco) la forma en que se procesan los datos, no puedo ver cómo se eludiría fácilmente.