language - error simple debido al uso de comillas dobles en un archivo jsp
jsp tag libraries (7)
Tengo la siguiente línea de código en un archivo JSP en mi aplicación web que está dando un error:
<jsp:setProperty name="db" property="userName" value="<%=request.getParameter("userName")%>"/>
El mensaje de error que recibo es:
org.apache.jasper.JasperException: /loginbean.jsp(6,59) El valor de atributo request.getParameter ("userName") se cita con "que se debe escapar cuando se usa dentro del valor
Lo que leí en algunos sitios es que los caracteres como ''
(comillas simples) o "
(comillas dobles) necesitan un prefijo con una secuencia de escape /
(barra invertida) si se van a usar.
Sin embargo, cuando intento y prefijo las comillas dobles (alrededor de la palabra userName) con barra invertida, inmediatamente obtengo el siguiente error: "Illegal Character / 92- Unclosed String Literal"
¿Cómo resuelvo este problema?
¡El ejemplo parece un ejemplo XSS! Esta es una vulnerabilidad de seguridad. Sugiero instalar una biblioteca de codificación html como la etiqueta c: out o http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Encoder.html#encodeForHTMLAttribute%28java.lang.String%29
También sugiero tomar el nombre de usuario de una sesión autenticada y no formar el parámetro de solicitud si es posible (¡a menos que sea solo un formulario de inicio de sesión / registro!)
Debe usar comillas simples en el parámetro de value
, es decir:
value=''<%=request.getParameter("userName")%>''
o establezca el parámetro org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING
en false
como se describe aquí:
http://blogs.sourceallies.com/2009/10/strict-quote-escaping-in-tomcat/
En caso de que la fase de validación Jasper JSP se use durante la construcción del proyecto.
Desde Tomcat 8 hay un nuevo atributo strictQuoteEscaping para la tarea Ant y un switch -no-strictQuoteEscaping para ejecutar org.apache.jasper.JspC desde la línea de comandos.
Esto se puede solucionar con un IDE Regexp Replace:
(</w+:(?:[^>]|<%=[^%]+%>)+=)"([^<"]*<%=[^%]*"[^%]*%>[^"]*)"
Para el texto de reemplazo, ingrese:
$ 1 ''$ 2''
Si no quiere modificar sus JSP, simplemente configure:
org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
en su {TOMCAT_ROOT}/conf/catalina.properties
. ¡Funciona de maravilla!
Felicitaciones desde aquí .
Si usa Tomcat 8.5+, la propiedad org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
no se reconocerá.
Pude configurar la propiedad correctamente en {TOMCAT_ROOT}/conf/web.xml
agregando lo siguiente dentro del bloque <servlet>
:
<init-param>
<param-name>strictQuoteEscaping</param-name>
<param-value>false</param-value>
</init-param>
si utiliza un "como delímetro de scriplet", no puede usar el delimitador de propiedad en getParameter. Por lo tanto, cambie el delímetro de scriptlet por ". Como parámetro de etiqueta, creo que no habrá ningún problema. De lo contrario, reemplace:
value = "<% = request.getParameter (" userName ")%>" />
por:
value = ''<% = request.getParameter ("userName")%>'' />