web-dev-qa-db-fra.com

erreur simple due à l'utilisation de guillemets dans un fichier jsp

J'ai la ligne de code suivante dans un fichier JSP dans mon application Web qui donne une erreur:

<jsp:setProperty name="db" property="userName" value="<%=request.getParameter("userName")%>"/>

Le message d'erreur que je reçois est le suivant:

org.Apache.jasper.JasperException: /loginbean.jsp(6,59) Valeur d'attribut request.getParameter ("userName") est cité avec "qui doit être échappé lorsqu'il est utilisé dans la valeur

Ce que j'ai lu sur certains sites, c'est que des caractères comme ' (guillemet simple) ou " (guillemet double) doivent être précédés d'une séquence d'échappement \ (barre oblique inverse) s'ils doivent être utilisés.

Cependant, lorsque j'essaie de préfixer les guillemets doubles (autour du nom d'utilisateur Word) avec une barre oblique inversée, le message d'erreur suivant s'affiche immédiatement: "Caractère illégal\92- Littéral de chaîne non fermée"

Comment résoudre ce problème?

30
Arvind

Vous devez utiliser des guillemets simples sur le paramètre value, c'est-à-dire:

value='<%=request.getParameter("userName")%>'

ou définissez le paramètre org.Apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING sur false comme décrit ici:

http://blogs.sourceallies.com/2009/10/strict-quote-escaping-in-Tomcat/

47
ryanprayogo

Si vous utilisez Tomcat 8.5+, la propriété org.Apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false Ne sera pas prise en compte.

J'ai réussi à définir la propriété dans {Tomcat_ROOT}/conf/web.xml en ajoutant les éléments suivants dans le bloc <servlet>:

<init-param>
    <param-name>strictQuoteEscaping</param-name>
    <param-value>false</param-value>
</init-param>
6
Dump Cake

Si vous ne souhaitez pas modifier vos JSP, définissez simplement:

org.Apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false

dans votre fichier {Tomcat_ROOT}/conf/catalina.properties. Fonctionne comme un charme!

Félicitations d'ici .

6
mppfiles

Cela peut être corrigé avec une expression rationnelle IDE]:

(<\w+:(?:[^>]|<%=[^%]+%>)+=)"([^<"]*<%=[^%]*"[^%]*%>[^"]*)"

Pour le texte de remplacement, entrez:

1 $ '2 $'

4
Stephan

L'exemple ressemble à un exemple XSS! Il s’agit d’une faille de sécurité ... Je suggère de mettre en place une bibliothèque de codage HTML telle que balise c: out ou http://owasp-esapi-Java.googlecode.com/svn/trunk_doc/latest/org/owasp /esapi/Encoder.html#encodeForHTMLAttribute%28Java.lang.String%29

Je suggère également de prendre le nom d'utilisateur d'une session authentifiée et de ne pas former le paramètre request si possible (sauf s'il s'agit uniquement d'un formulaire de connexion/enregistrement!)

1
DavidC

Si la phase de validation JSP Jasper est utilisée pendant la construction du projet.

Depuis Tomcat 8, il existe un nouvel attribut strictQuoteEscaping pour la tâche Ant et un commutateur -no-strictQuoteEscaping pour exécuter org.Apache.jasper.JspC à partir de la ligne de commande.

0
Vadzim

si vous utilisez un délimiteur "as scriplet, vous ne pouvez pas en utiliser quelques-uns en tant que délimiteur de propriété dans getParameter. Modifiez le délimètre du scriptlet en".

value = "<% = request.getParameter (" userName ")%>" />

par :

valeur = '<% = request.getParameter ("userName")%>' />

0
Salim Hamidi