2011-07-04 7 views
13

He estado haciendo esto todo el tiempo en mi código JSP :

<c:out value="${myVar}"/> 

Hoy me he dado cuenta por primera vez que me parece ser capaz de utilizar esta versión más corta del mismo modo que:

${myVar} 

funciona sin <c:out>!

Tal vez esto se debe a que mi página se declara así:

<%@ page language="java" contentType="text/html; 
charset=utf-8" pageEncoding="utf-8" isELIgnored="false" %> 

lo tanto, mi pregunta es, puedo reemplazar <c:out> en mi código con esta versión más corta? ¿Hay alguna razón para seguir usando <c:out>? ¿O hay lugares donde todavía podría necesitarlo?

Respuesta

23

<c:out> hace más que simplemente dar salida al texto. Se escapa de los caracteres especiales HTML. Úselo (or ${fn:escapeXml()}) cada vez que no esté absolutamente seguro de que el texto no contiene ninguno de estos caracteres: ", ', <, >, &. De lo contrario, tendrá HTML no válido (en el mejor de los casos), una página rota o ataques de secuencias de comandos entre sitios (en el peor de los casos).

Le daré un ejemplo simple para que lo entienda. Si desarrolla un foro, y alguien envía el siguiente mensaje, y no utiliza <c:out> mostrar este mensaje, usted tiene un problema:

<script>while (true) alert("you're a loser");</script> 
+0

"Looser"? Creo que te refieres a "perdedor". – MatthewD

+0

Se corrigió el error tipográfico. Gracias. –

+0

Esto también se aplica cuando no está directamente enviando contenido a la página (por ejemplo: ''). ¿Debería escaparse '$ {someVal}' en este caso? o solo tiene que preocuparse por evitarlo cuando imprima en la página (p. ej .: '

') – theyuv

6

Tal vez esto se debe a que mi página se declaró de esta manera:

<%@ page language="java" contentType="text/html; 
charset=utf-8" pageEncoding="utf-8" isELIgnored="false" %> 

falso. Solo <%@page pageEncoding="UTF-8" %> fue suficiente. El remanente ya es el predeterminado.

EL en el texto de la plantilla es compatible ya que JSP 2.0 va de la mano con Servlet 2.4 (que ya estaba en funcionamiento desde 2003 ... manténgase actualizado). Por lo tanto, cuando está ejecutando un contenedor compatible con Servlet 2.4 (por ejemplo, Tomcat 5.5 o posterior) con una API de Servlet 2.4 declarada como web.xml, podrá usar EL en el texto de la plantilla.

Sin embargo, no debe usarlo para (re) mostrar de entrada controlada por el usuario. Por lo tanto, no lo use para (re) mostrar encabezados de solicitud (guardados), solicitar cookies, solicitar URL, solicitar parámetros, solicitar cuerpos, etc. Esto abrirá las puertas al XSS attacks.

Cuestiones relacionadas