unescape - javascript decode html
¿Cómo unescape html en javascript? (6)
Algunas conjeturas para lo que vale.
innerHTML es, literalmente, el navegador que interpreta hte html.
así que <se convierte en el símbolo menos que, porque eso es lo que sucedería si colocas <en el documento html.
El mayor riesgo de seguridad de las cadenas con & es una declaración eval, cualquier JSON podría hacer que la aplicación sea insegura. No soy un experto en seguridad, pero si las cadenas siguen siendo cadenas, deberías estar bien.
Esta es otra forma en la que innerHTML es seguro, la cadena sin escaparse está en camino de convertirse en html, por lo que no hay riesgo de que ejecute el javascript.
Esta pregunta ya tiene una respuesta aquí:
- ¿Unescape de las entidades HTML en Javascript? 11 respuestas
Estoy trabajando con un servicio web que me dará valores como:
var text = "<<<&&&";
Y necesito imprimir esto para que parezca "<<< &&&" con javascript.
Pero aquí está el problema: no puedo usar HTML interno (en realidad estoy enviando estos valores a una biblioteca prototipo que crea nodos de texto para que no se escape la cadena de HTML sin formato. Si editar la biblioteca no sería una opción, cómo ¿Podrías escapar de este html?
Necesito entender el trato real aquí, ¿cuál es el riesgo de escapar de este tipo de cadenas? ¿Cómo hace innerHTML? ¿Y qué otras opciones existen?
EDITAR - El problema no es usar javascript normal escape / unescape o incluso jQuery / prototype implementaciones de ellos, sino sobre los problemas de seguridad que pueden surgir al usar cualquiera de estos ... alias "Me dijeron que era bastante inseguro usarlos. "
(Para aquellos que intentan entender de qué diablos estoy hablando con innerHTML sin salir de esta extraña cadena, echa un vistazo a este sencillo ejemplo:
<html>
<head>
<title>createTextNode example</title>
<script type="text/javascript">
var text = "<<<&&&";
function addTextNode(){
var newtext = document.createTextNode(text);
var para = document.getElementById("p1");
para.appendChild(newtext);
}
function innerHTMLTest(){
var para = document.getElementById("p1");
para.innerHTML = text;
}
</script>
</head>
<body>
<div style="border: 1px solid red">
<p id="p1">First line of paragraph.<br /></p>
</div><br />
<button onclick="addTextNode();">add another textNode.</button>
<button onclick="innerHTMLTest();">test innerHTML.</button>
</body>
</html>
Cambie la cadena de prueba a <b><<&&&</b>
para tener un mejor control sobre cuál es el riesgo ... (o mejor, <img src=''http://www.spam.com/ASSETS/0EE75B480E5B450F807117E06219CDA6/spamReg.png'' onload=''alert(document.cookie);''>
para el spam de robo de cookies)
Vea el ejemplo en http://jsbin.com/uveme/139/ (basado en su ejemplo, usar un prototipo para el escape). Intente hacer clic en los cuatro botones diferentes para ver los diferentes efectos. Sólo el último es un riesgo de seguridad. (Puede ver / editar la fuente en http://jsbin.com/uveme/139/edit ) El ejemplo no roba sus cookies ...
- Si su texto proviene de una fuente conocida y segura y no se basa en ninguna entrada del usuario , entonces usted está seguro.
- Si está usando
createTextNode
para crear un nodo de texto yappendChild
para insertar ese objeto de nodo no modificado directamente en su documento , está seguro. - De lo contrario, debe tomar las medidas adecuadas para garantizar que el contenido inseguro no pueda llegar al navegador de su espectador.
Nota: Como lo señaló Ben Vinegar, usar createTextNode
no es una bala mágica: usarlo para escapar de la cadena, luego usar textContent
o innerHTML
para eliminar el texto escapado y hacer otras cosas con él no lo protege en sus usos subsiguientes. En particular, el método escapeHtml en la respuesta de Peter Brown a continuación es inseguro si se usa para poblar atributos.
Mientras su código esté creando nodos de texto, el navegador NO debe mostrar nada perjudicial. De hecho, si inspecciona la fuente del nodo de texto generado utilizando Firebug o la barra de herramientas de desarrollo de IE, verá que el navegador está volviendo a escapar de los caracteres especiales.
dale un
"<script>"
y lo escapa a:
"<script>"
Existen varios tipos de nodos: Elementos, Documentos, Texto, Atributos, etc.
El peligro es cuando el navegador interpreta que una cadena contiene un script. La propiedad innerHTML es susceptible a este problema, ya que le indicará al navegador que cree nodos Element, uno de los cuales podría ser un elemento de script, o tener Javascript en línea como los controladores onmouseover. La creación de nodos de texto evita este problema.
Prueba las funciones escape y unescape disponibles en Javascript.
Más detalles: http://www.w3schools.com/jsref/jsref_unescape.asp
Una muy buena lectura es http://benv.ca/2012/10/4/you-are-probably-misusing-DOM-text-methods/ que explica por qué la convención de usar createTextNode en realidad no es segura en absoluto.
Un ejemplo representativo toma del artículo anterior del riesgo:
function escapeHtml(str) {
var div = document.createElement(''div'');
div.appendChild(document.createTextNode(str));
return div.innerHTML;
};
var userWebsite = ''" onmouseover="alert(/'derp/')" "'';
var profileLink = ''<a href="'' + escapeHtml(userWebsite) + ''">Bob</a>'';
var div = document.getElementById(''target'');
div.innerHtml = profileLink;
// <a href="" onmouseover="alert(''derp'')" "">Bob</a>
function mailpage()
{ mail_str = "mailto:?subject= Check out the " + escape( document.title );
mail_str += "&body=" + escape("I thought you might be interested in the " + document.title + "./n/n" );
mail_str += escape("You can view it at " + location.href + "./n/n");
location.href = mail_str;
}