Estoy generando valores de una base de datos (en realidad no está abierto a la entrada pública, pero está abierto a la entrada de un usuario de la empresa, lo que significa que no estoy preocupado por XSS ).
Estoy tratando de generar una etiqueta como esta:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
DESCRIPTION es en realidad un valor de la base de datos que es algo como esto:
Prelim Assess "Mini" Report
He intentado reemplazar "con \", pero no importa lo que intente, Firefox sigue cortando mi llamada de JavaScript después del espacio después de la palabra Evaluar , y está causando todo tipo de problemas.
Debo perder la respuesta obvia, pero por mi vida no puedo entenderlo.
¿A alguien le interesa señalar mi idiotez?
Aquí está la página HTML completa ( eventualmente será una página ASP.NET , pero para resolver esto eliminé todo lo demás excepto el código del problema)
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
</body>
</html>
fuente
onclick
archivo adjunto de su evento sea discreto y mover toda la información de su base de datos a una isla de datos. Las cosas estarán más limpias y en realidad obtendrás algún tipo de error de sintaxis cuando tus cadenas se escapen mal.Respuestas:
Debe escapar de la cadena en la que está escribiendo
DoEdit
para eliminar los caracteres de comillas dobles. Están causando que elonclick
atributo HTML se cierre prematuramente.El uso del carácter de escape JavaScript
\
no es suficiente en el contexto HTML. Es necesario sustituir el doble cita con la representación XML de entidad adecuada,"
.fuente
'mystring'.replace(/"/g, '"');
"
funcionaría en este caso particular, como sugerí antes de mí, debido al contexto HTML.Sin embargo, si desea que su código JavaScript se escape independientemente para cualquier contexto, puede optar por la codificación nativa de JavaScript:
'
se\x27
"
convierte en\x22
Entonces su onclick se convertiría en:
DoEdit('Preliminary Assessment \x22Mini\x22');
Esto funcionaría, por ejemplo, también cuando se pasa una cadena de JavaScript como parámetro a otro método de JavaScript (
alert()
es un método de prueba fácil para esto).Me refiero a la pregunta duplicada de desbordamiento de pila, ¿cómo puedo escapar de una cadena dentro del código JavaScript dentro de un controlador onClick? .
fuente
"
will, por supuesto, funcionará."
se requiere en los valores de entrada, es decir,<input value="\x22quoted string\x22">
no funcionará.onclick="..."
). El valor de unvalue
atributo no se procesa dentro de un contexto JavaScript, solo dentro de un contexto HTML.'mystring'.replace(/"/g, '\\x22').replace(/'/g, '\\x27')
Debería hacer el truco.
fuente
Amigos, ya existe la
unescape
función en JavaScript que hace el escape para\"
:fuente
El problema es que HTML no reconoce el carácter de escape. Podría solucionarlo utilizando las comillas simples para el atributo HTML y las comillas dobles para el onclick.
fuente
Así es como lo hago, básicamente
str.replace(/[\""]/g, '\\"')
.fuente
Si está ensamblando el HTML en Java, puede usar esta buena clase de utilidad de Apache commons-lang para hacer todo el escape correctamente:
fuente
He hecho una muestra usando jQuery
Y esto funciona en Internet Explorer y Firefox.
fuente
Puede copiar esas dos funciones (enumeradas a continuación) y utilizarlas para escapar / no escapar de todas las comillas y caracteres especiales. No tiene que usar jQuery ni ninguna otra biblioteca para esto.
fuente
Busque en el siguiente código que escapa a las comillas simples como parte de la cadena ingresada utilizando una expresión regular. Valida si la cadena ingresada por el usuario está separada por comas y, al mismo tiempo, incluso escapa a las comillas simples ingresadas como parte de la cadena.
Para escapar de las comillas simples, solo ingrese una barra invertida seguida de una comilla simple como: \ ' como parte de la cadena. Usé el validador jQuery para este ejemplo, y puedes usarlo según tu conveniencia.
Ejemplos de cadenas válidas:
'Hola'
'Hola Mundo'
'Hola Mundo'
'Hola Mundo',' '
'Es mi mundo', 'No puedo disfrutar esto sin mí', 'Bienvenido, Invitado'
HTML:
JavaScript:
fuente
Escapar de espacios en blanco también. Me parece que Firefox está asumiendo tres argumentos en lugar de uno.
es el personaje espacial que no se rompe. Incluso si no es todo el problema, puede ser una buena idea.fuente
Necesita escapar de las comillas con barras diagonales inversas dobles.
Esto falla (producido por json_encode de PHP ):
Esto funciona:
fuente
Puede usar los métodos jQuery escape () y unescape (). Como abajo,
Use
escape(str);
para escapar de la cadena y recuperarse nuevamente usandounescape(str_esc);
.fuente