2011-02-09 10 views
16

Agradecería que me proporcionara un conjunto de pautas claras o reglas para manejar cadenas de escape. Lo que uso para escanear cadenas es la biblioteca apache commons-lang-x.x.jar. Específicamente el método StringEscapeUtils.escapeHtml(String toEscape).¿Dónde debería escapar las cadenas de HTML, la página JSP o los servlets?

necesito saber:

(1) ¿Dónde es mejor para escapar de las cadenas, en la página JSP o en el servlet?

(2) ¿Qué recomienda StringEscapeUtils.escapeHtml (..) o <c:> cabo de JSTL

(3) Manipulación de líneas múltiples, lo que es mejor, usar <br> directamente en la cadena,

String strError = "Invalid username.\nPlease try again.";

o

String strError = "Invalid username.<br>Please try again.";

012: o \ un método nl2br() n y

(4) ¿Cómo hago para escapar de las cadenas que reciben comodines, ejemplo:

String strError = "Invalid user [%s].<br>Please specify another user."

(5) Desde Javascript caracteres de escape son diferentes. ¿Qué debo usar para escapar de las cadenas de Java que se van a representar dentro de las secciones de javascript de la página JSP (por ejemplo, var name = "<%=javaStringHoldingName%>").

Respuesta

15

Solo necesita escapar exactamente allí donde pueda dañar. En este caso particular, está en la vista. El HTML controlado por el usuario puede dañar cuando se inserta entre todo su HTML en la vista. Esta es una fuente para XSS.

En una página bien diseñada JSP (es decir: sin scriptlets), JSTL le ofrece la función <c:out> etiqueta y fn:escapeXml() para escapar de HTML/XML.

<c:out value="${param.foo}" /> 
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" /> 
+0

¿Qué sucede cuando tengo una cadena de plantilla como "Rango no válido [% s].
debe contener solo caracteres alfanuméricos . ". Y digamos que el valor es "1 .. <5". ¿Cómo se manejaría esto al escapar? Tenga en cuenta que la cadena de la plantilla contiene un
porque está destinado a mostrarse en dos líneas. –

+0

En JSP básico, normalmente usa JSTL ''. O cuando usa un marco (MVC) además de JSP como Spring, JSF, etc., tienen todas sus propias etiquetas de formato de mensaje. Ver también esta pregunta relacionada que hoy coincido por casualidad: http://stackoverflow.com/questions/4961558/best-practice-for-translations – BalusC

+0

para que lo sepas, también funciona usando 'StringEscapeUtils.escapeHtml (" lala ") ; 'impreso en el jsp. – Vince

2

Para dos de sus preguntas:

1) Escapar cadenas para fines de visualización - Me parece que es una vista de la preocupación. Su JSP podría manejar esto, si está usando su JSP como una vista.

3) Los mensajes de error de la capa de lógica de modelos/negocios no deben incluir el formato, como los caracteres de nueva línea. Deje que su vista determine cómo formatear los mensajes de error. Con HTML, el uso de una etiqueta div con un estilo de ancho adecuado puede eliminar la necesidad de etiquetas br, por ejemplo.

+0

¿Puedes editar tu respuesta para darme un ejemplo sobre el tercer punto? Por cierto, ¿dónde está el segundo punto? Por favor, lea el ejemplo en la sección de comentarios de la primera respuesta en responder a BalusC –

2

que probablemente no pase un objeto String, sino que sólo tiene que pasar un objeto de error hasta la vista y dejar que el JSP haga lo que quiera

En el controlador:

errorObj.name = "invalid login"; 
errorObj.description = "try again"; 

En la vista:

<c:out value="${errorObj.name}" /><br /><c:out value="${errorObj.description}" /> 

No muy relacionado con su pregunta, pero también es una buena practique usar un mensaje como "intento de inicio de sesión no válido" independientemente del error de inicio de sesión.El mensaje que está dando, "nombre de usuario no válido", le permite a alguien que intenta piratear sus cuentas saber si tienen un buen nombre de usuario que puedan usar para atacar la contraseña. Si esto se expone públicamente, esto puede ser un problema pequeño, pero muy real.

Cuestiones relacionadas