XSS prévention en JSP/Servlet application web
8 réponses
XSS peut être prévenu dans JSP en utilisant JSTL <c:out>
tag or fn:escapeXml()
EL function when (re)displaying user-controlled input . Cela inclut les paramètres de la requête, les en-têtes, les cookies, L'URL, le corps, etc. Tout ce que vous extrayez de l'objet de la requête. En outre, l'entrée contrôlée par l'Utilisateur des requêtes précédentes qui est stockée dans une base de données doit être échappée pendant réafficher.
par exemple:
<p><c:out value="${bean.userControlledValue}"></p>
<p><input name="foo" value="${fn:escapeXml(param.foo)}"></p>
cela évitera les caractères qui peuvent malformer le HTML rendu tels que <
, >
, "
, '
et &
en entités HTML/XML telles que <
, >
, "
, '
et &
.
notez que vous n'avez pas besoin de Les échapper dans le code Java (Servlet), car ils sont inoffensifs. Certains peuvent choisir de Les échapper pendant le traitement requête (comme vous le faites dans le Servlet ou le filtre) au lieu du traitement réponse (comme vous le faites dans JSP), mais de cette façon vous pouvez risquer que les données inutilement obtenir double échappée (par exemple &
devient &amp;
au lieu de &
et en fin de Compte l'utilisateur final verrait &
être présenté), ou que le DB-stocké les données deviennent invendables (par exemple lors de l'exportation données à JSON, CSV, XLS, PDF, etc qui ne nécessite pas HTML-échapper à tous). Vous perdrez également le contrôle social parce que vous ne savez plus ce que l'Utilisateur a réellement rempli. En tant qu'administrateur de site, vous aimeriez vraiment savoir quels utilisateurs/IPs essaient D'effectuer XSS, de sorte que vous puissiez facilement les suivre et prendre des mesures en conséquence. S'échapper pendant le traitement de la demande ne devrait être utilisé que comme dernier recours lorsque vous avez vraiment besoin de réparer une épave de train d'un héritage web mal développé application dans le temps le plus court possible. Néanmoins, vous devriez finalement réécrire vos fichiers JSP pour devenir XSS-safe.
si vous souhaitez rediffuser L'entrée contrôlée par l'utilisateur en tant que HTML dans lequel vous souhaitez n'autoriser qu'un sous-ensemble spécifique de balises HTML comme <b>
, <i>
, <u>
, etc, puis vous devez nettoyer l'entrée par une liste blanche. Vous pouvez utiliser un analyseur HTML comme Jsoup pour cela. Mais, beaucoup mieux est d'introduire de l'homme langage de balisage convivial tel que Markdown (également utilisé ici sur le débordement de la pile). Ensuite, vous pouvez utiliser un analyseur de Markdown comme CommonMark pour cela. Il a également intégré des capacités D'assainissement HTML. Voir aussi je cherche un encodeur HTML Java .
la seule préoccupation du côté du serveur en ce qui concerne les bases de données est injection SQL prévention. Vous devez vous assurer que vous jamais string-concatenate entrée contrôlée par l'utilisateur directement dans la requête SQL ou JPQL et que vous utilisez des requêtes paramétrées tout le chemin. En termes JDBC, cela signifie que vous devez utiliser PreparedStatement
au lieu de Statement
. En termes de JPA, utiliser Query
.
une alternative serait de migrer de JSP/Servlet vers le cadre MVC de Java EE JSF . Il a construit XSS (et CSRF!) la prévention sur tous les lieux. Voir aussi CSRF, XSS et SQL Injection attack prevention in JSF .
comment-pour-éviter-xss a été posée à plusieurs reprises. Vous trouverez beaucoup d'informations dans StackOverflow. En outre, OWASP site Web a une feuille de triche de prévention XSS que vous devriez passer par.
Sur les bibliothèques à utiliser, OWASP de l'ESAPI bibliothèque a un java saveur. Vous devriez essayer ça. En outre, chaque cadre que vous utilisez a une certaine protection contre XSS. Encore une fois, le site Web de L'OWASP contient des informations sur la plupart des cadres populaires, donc je recommande d'aller à travers leur site.
J'ai eu beaucoup de chance avec OWASP Anti-Samy et un conseiller D'AspectJ sur tous mes contrôleurs de printemps qui empêchent XSS d'entrer.
public class UserInputSanitizer {
private static Policy policy;
private static AntiSamy antiSamy;
private static AntiSamy getAntiSamy() throws PolicyException {
if (antiSamy == null) {
policy = getPolicy("evocatus-default");
antiSamy = new AntiSamy();
}
return antiSamy;
}
public static String sanitize(String input) {
CleanResults cr;
try {
cr = getAntiSamy().scan(input, policy);
} catch (Exception e) {
throw new RuntimeException(e);
}
return cr.getCleanHTML();
}
private static Policy getPolicy(String name) throws PolicyException {
Policy policy =
Policy.getInstance(Policy.class.getResourceAsStream("/META-INF/antisamy/" + name + ".xml"));
return policy;
}
}
vous pouvez obtenir le conseiller D'Spectj du ce stackoverflow post
je pense que c'est une meilleure approche alors c:en particulier si vous faites beaucoup de javascript.
Gérer XSS nécessite de multiples validations, données du côté du client.
- validations D'entrée (validation du formulaire) Côté Serveur. Il existe plusieurs façons d'aller à ce sujet. Vous pouvez essayer JSR 303 bean validation ( hibernate validator ), ou ESAPI Input Validation framework . Bien que je ne l'ai pas essayé moi-même (encore), il ya une annotation qui vérifie la sécurité html (@SafeHtml) . Vous pouvez en effet utiliser Hibernate validator avec Spring MVC pour les validations bean - > Ref
- escapade URL requests - pour toutes vos requêtes HTTP, utilisez une sorte de filtre XSS. J'ai utilisé ce qui suit pour notre application web et il prend soin de nettoyer la demande D'URL HTTP - http://www.servletsuite.com/servlets/xssflt.htm
- échapper data / html retourné au client (voir ci-dessus l'explication de @BalusC).
je suggère de tester régulièrement les vulnérabilités à l'aide d'un outil automatisé, et de corriger tout ce qu'il trouve. Il est beaucoup plus facile de Suggérer une bibliothèque pour aider avec une vulnérabilité spécifique que pour toutes les attaques XSS en général.
Skipfish est un outil open source de Google que j'ai enquêté: il trouve beaucoup de choses, et semble intéressant d'utiliser.
il n'y a pas de solution facile, hors de la boîte contre XSS. L'API OWASP ESAPI a un support pour l'évasion qui est très utile, et ils ont des bibliothèques d'étiquettes.
mon approche consistait essentiellement à étendre les balises stuts 2 de la manière suivante.
- modifie la balise s:property tag de manière à ce qu'elle puisse prendre des attributs supplémentaires indiquant quelle sorte d'évasion est requise (escapeHtmlAttribute=" true " etc.). Cela implique la création d'une nouvelle Propriété et Cours de propriététag. La classe de propriétés utilise L'api OWASP ESAPI pour l'évasion.
- Changement freemarker modèles pour utiliser la nouvelle version de s:de la propriété et de l'ensemble de l'échappement.
si vous ne voulez pas modifier les classes de l'étape 1, une autre approche serait d'importer les balises ESAPI dans les modèles freemarker et de s'échapper si nécessaire. Ensuite, si vous avez besoin d'utiliser une étiquette de propriété s:dans votre JSP, enveloppez-la avec et étiquette ESAPI.
I ont écrit une explication plus détaillée ici.
http://www.nutshellsoftware.org/software/securing-struts-2-using-esapi-part-1-securing-outputs /
je suis d'accord qu'échapper aux entrées n'est pas idéal.
mon opinion personnelle est que vous devriez éviter d'utiliser JSP/ASP/PHP/etc pages. Au lieu de cela, sortie vers une API similaire à SAX (conçu uniquement pour l'appel plutôt que la manipulation). De cette façon, il y a une seule couche qui doit créer une sortie bien formée.
si vous voulez échapper automatiquement toutes variables JSP sans avoir à envelopper explicitement chaque variable, vous pouvez utiliser un el resolver comme détaillé ici avec source complète et un exemple (JSP 2.0 ou plus récent) , et discuté plus en détail ici :
par exemple, en utilisant le résolveur de EL mentionné ci-dessus, votre code JSP restera ainsi, mais chaque variable sera automatiquement échappée par le résolution 151980920"
...
<c:forEach items="${orders}" var="item">
<p>${item.name}</p>
<p>${item.price}</p>
<p>${item.description}</p>
</c:forEach>
...
si vous voulez forcer l'évasion par défaut au printemps, vous pouvez considérer cela aussi, mais il n'échappe pas aux expressions EL, juste à la sortie des balises, je pense:
http://forum.springsource.org/showthread.php?61418-Spring-cross-site-scripting&p=205646#post205646
Note: une autre approche de El escaping qui utilise les transformations XSL pour préprocéder aux fichiers JSP peut être trouvée ici:
http://therning.org/niklas/2007/09/preprocessing-jsp-files-to-automatically-escape-el-expressions /