J'affiche les chaînes dans mon JSP de cette façon:
${someString}
cette chaîne peut, bien sûr, contenir des caractères html spéciaux. Actuellement, il est possible d'injecter du code malveillant HTML (par exemple, si someString est une inclusion javascript - <script src...>
).
Comment puis-je m'assurer que toutes les chaînes sont échappées avant l'impression?
J'utilise Spring MVC et JSP.
Vous pouvez utiliser JSTL core :
<%@ taglib prefix="c" uri="http://Java.Sun.com/jsp/jstl/core" %>
Utilisez la balise <c:out value="${someString}"/>
pour afficher les chaînes. <c:out>
Échappe les caractères HTML afin que vous puissiez éviter les scripts intersites, vous pouvez le spécifier en définissant l'attribut escapeXml=true
. Un autre avantage est que vous pouvez également fournir une valeur par défaut au cas où value
serait évalué à null
.
Vous pouvez également utiliser la fonction fn:escapeXml()
EL. Vous devez inclure les fonctions JSTL pour cela.
<%@ taglib prefix="fn" uri="http://Java.Sun.com/jsp/jstl/functions" %>
Une autre façon possible, sera de construire un ELResolver personnalisé.
Permet la personnalisation du comportement de résolution de variable et de propriété pour l'évaluation d'expression EL.
Ce blog fournit un exemple pratique de la façon dont cela peut être fait.
Pour l'ensemble de l'application Spring MVC, vous pouvez spécifier l'échappement dans le web.xml :
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
Mais l'échappement ne s'applique qu'aux balises spring
, comme:
<form:input path="formField" htmlEscape="true" />
Enfin, vous pouvez essayer la bibliothèque tierce XSSFilter .
Vous pouvez également contrôler ce comportement au niveau de la page à l'aide de <spring:htmlEscape defaultHtmlEscape="true" />
En JSP/Java, vous devez utiliser ce code:
En JSP/HTML:
<c:out value="TR tag </tr> Script Tag <script>alert("hello Rahul")</script>" escapeXml="true" />