Estoy recuperando algunos datos de una base de datos (todos usando declaraciones preparadas) en una matriz, luego envío esos datos como JSON
Luego proceso los datos con JavaScript y los muestro en la página web (como una lista).
¿Es aceptable ejecutar htmlentities($data, ENT_QUOTES) en los resultados de la base de datos mientras los agrego a la matriz antes de convertirlos a JSON y generarlos? ¿Tendré algún problema al hacerlo?
¿O debería hacer todo esto usando JavaScript? Por lo general, siempre usaría htmlentities() antes de enviar datos directamente a una página web, pero no estoy seguro de si está bien hacerlo cuando uso JSON y analizo los datos con JavaScript. Por lo que sé, tampoco hay una función similar en JS.
La base de datos tiene campos de texto y podría contener cualquier cosa (incluidas cosas que romperán una página web)
Editar: código de ejemplo (lado PHP)
$DB_results = array('Test', '123', '<b>hello</b>', 'B&$B%'); echo json_encode($DB_results);Código JS:
var db_results = JSON.parse(this.responseText); // this is from an AJAX query var dbr_length = db_results.length; for (var i = 0; var i < dbr_length; i++) { var li = document.createElement('li'); li.appendChild(document.createTextNode(years[i])); document.getElementById('mylist').appendChild(li); } ¿Debería modificar el código PHP a lo siguiente (tenga en cuenta que se htmlentities() al agregar los datos a la matriz)
$DB_results = array( htmlentities('Test', ENT_QUOTES), htmlentities('123', ENT_QUOTES), htmlentities('<b>hello</b>', ENT_QUOTES), htmlentities('B&$B%', ENT_QUOTES) ); echo json_encode($DB_results);Creo que usted mismo respondió la pregunta, pero si quiere más confianza, puede consultar los documentos de MDN para Document.createTextNode() :
Crea un nuevo nodo
Text. Este método se puede utilizar para escapar de los caracteres HTML.
Y el código en su pregunta (ligeramente modificado para ejecutar sin ReferenceError s):
document.body.appendChild(document.createElement('ul')).id = 'mylist'; const json = `["Test","123","<b>hello</b>","B&$B%"]`; const dbResults = JSON.parse(json); for (const str of dbResults) { const li = document.createElement('li'); li.appendChild(document.createTextNode(str)); document.getElementById('mylist').appendChild(li); }