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?
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/
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>
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 .
Cela peut être corrigé avec une expression rationnelle IDE]:
(<\w+:(?:[^>]|<%=[^%]+%>)+=)"([^<"]*<%=[^%]*"[^%]*%>[^"]*)"
Pour le texte de remplacement, entrez:
1 $ '2 $'
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!)
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.
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")%>' />