XSS prévention en JSP/Servlet application web
Comment puis-je empêcher les attaques XSS dans une JSP/Servlet application web?
- La grande poste comment empêcher les attaques XSS dans différentes situations est posté là: stackoverflow.com/questions/19824338/...
Vous devez vous connecter pour publier un commentaire.
XSS peut être évité en JSP en utilisant JSTL
<c:out>
tag oufn:escapeXml()
EL de la fonction lors de la (re)affichage contrôlée par l'utilisateur d'entrée. Cela inclut les paramètres de la demande, en-têtes, les cookies, URL, corps, etc. Tout ce qui vous extraire de l'objet de requête. Aussi l'utilisateur à l'entrée contrôlée à partir de la précédente demande qui est stockée dans une base de données doit être échappés lors de l'affichage.Par exemple:
Cela permettra d'échapper les caractères qui peuvent malform le rendu HTML comme
<
,>
,"
,'
et&
en HTML/XML entités comme<
,>
,"
,'
et&
.Notez que vous n'avez pas besoin d'échapper à la Java (Servlet) du code, puisqu'ils sont inoffensifs, là-bas. Certains peuvent opter pour leur échapper pendant demande de traitement (comme vous le faites dans le Servlet ou Filtre) au lieu de réponse de traitement (comme vous le faites dans JSP), mais de cette façon, vous pouvez risque que les données inutilement obtenir le double échappement (par exemple
&
devient&amp;
au lieu de&
et, finalement, l'utilisateur final serait de voir&
être présenté), ou que le DB-données stockées devient portables (par exemple, lors de l'exportation de données en JSON, CSV, XLS, PDF, etc qui ne nécessite pas de HTML échapper à tous). Vous aurez aussi perdre le contrôle social, parce que vous ne savez plus ce que l'utilisateur a effectivement rempli. Vous feriez comme étant un administrateur du site aiment vraiment de savoir quels utilisateurs/IPs sont en train de s'exécuter XSS, de sorte que vous pouvez facilement suivre et de prendre des mesures en conséquence. De s'échapper pendant le traitement de la demande devraient seulement être utilisés en tant que dernier recours, quand vous avez vraiment besoin de fixer une épave de train d'un mal développé web de l'héritage d'application dans le temps le plus court possible. Néanmoins, vous devriez en fin de compte réécrire vos fichiers JSP pour devenir XSS-fort.Si vous souhaitez afficher de nouveau contrôlée par l'utilisateur saisie au format HTML dans lequel vous souhaitez autoriser uniquement un sous-ensemble de balises HTML comme
<b>
,<i>
,<u>
, etc, alors vous devez désinfecter l'entrée par une liste blanche. Vous pouvez utiliser un analyseur HTML comme Jsoup pour cela. Mais, beaucoup mieux est d'introduire un homme sympathique langage de balisage tel que Markdown (également utilisé ici sur Stack Overflow). Ensuite, vous pouvez utiliser un Abattement de l'analyseur comme CommonMark pour cela. Il a également builtin HTML désinfection des capacités. Voir aussi Je suis à la recherche d'un codeur HTML Java.La seule préoccupation dans le côté serveur à l'égard des bases de données est L'injection SQL de prévention. Vous devez vous assurer que vous n'avez jamais à la chaîne concaténer contrôlée par l'utilisateur saisie directement dans le SQL ou requête JPQL et que vous êtes en utilisant des requêtes paramétrées dans tous les sens. Dans JDBC termes, cela signifie que vous devez utiliser
PreparedStatement
au lieu deStatement
. En JPA termes, l'utilisationRequête
.Une autre solution serait de migrer à partir de JSP/Servlet Java EE du framework MVC JSF. Il a builtin XSS (et CSRF!) la prévention sur tous les lieux. Voir aussi CSRF, XSS et attaque par Injection SQL de prévention dans JSF.
"SELECT ... WHERE SOMEVAL = " + someval
au lieu d'utiliser des requêtes paramétrées comme vous l'avez indiqué. Pas un ORM peut protéger contre ce genre de développeur erreurs.<div><c:out value="${htmlContent}" escapeXml="false" /></div>
icihtmlContent
valeur est quelque chose comme<span><h1>Hi</h1></span>
(cette valeur provenant de la base de données) maintenant, si je retireescapeXml="false"
dec:out
puis sa s'affiche comme il est sur la page, alors si garderescapeXml="false"
son analyse de l'objet dom correctement, mais lorsque mon htmlContent avoir un code de script puis xss question est à venir.htmlContent
est<span><h1><script>alert("Hi");</script></h1></span>
alors si j'utilise<c:out value="${htmlContent}" escapeXml="false" /></div>
en jsp puis sur le navigateur de l'utilisateur obtiendra boîte d'alerte de sorte qu'il peut leades XSS question. Merci de me suggérer ce que je peux faire dans cette situation.La façon de prévenir les attaques de type xss a été posée à plusieurs reprises. Vous trouverez une foule d'informations sur StackOverflow. Aussi, OWASP site web dispose d'un XSS prévention de la feuille de triche que vous devez passer par.
Sur les bibliothèques à utiliser, OWASP de l'ESAPI bibliothèque a un java saveur. Vous devriez essayer ça. En outre, chaque framework que vous utilisez a une certaine protection contre les attaques de type XSS. Encore une fois, OWASP site présente de l'information sur les cadres les plus populaires, donc je vous conseille de passer par leur site.
J'ai eu beaucoup de chance avec OWASP Anti-Samy et un AspectJ conseiller sur tous mes Printemps Contrôleurs de blocs XSS d'entrer.
Vous pouvez obtenir le AspectJ conseiller de la cette stackoverflow post
Je pense que c'est une meilleure approche alors c:en particulier si vous faites beaucoup de javascript.
Gestion XSS exige de multiples validations, les données côté client.
Je proposerais régulièrement des tests de vulnérabilités à l'aide d'un outil automatisé, et la fixation de tout ce qu'il trouve. Il est beaucoup plus facile de suggérer une bibliothèque pour les aider avec une vulnérabilité spécifique pour toutes les attaques XSS en général.
Skipfish est un outil open source de Google que j'ai étudié: il trouve beaucoup de choses, et semble valoir la peine de l'utiliser.
Il n'est pas facile, hors de la boîte solution contre les XSS. L'OWASP ESAPI API a un certain appui pour l'échappement qui est très utile, et ils ont des bibliothèques de balises.
Mon approche était essentiellement à étendre le stuts 2 balises dans l'une des façons suivantes.
Si vous ne voulez pas modifier les classes dans l'étape 1, une autre approche serait d'importer l'ESAPI tags dans le freemarker modèles et échapper au besoin. Alors si vous avez besoin d'utiliser un s:propriété de la balise dans votre JSP, enveloppez-la avec et ESAPI tag.
J'ai é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 échapper à des entrées n'est pas l'idéal.
Mon opinion personnelle est que vous devriez éviter d'utiliser des JSP/ASP/PHP/etc pages. Au lieu de sortie à une API similaire à SAX (uniquement conçu pour vocation plutôt que sur le traitement). De cette façon, il y a une seule couche de créer ainsi formé de sortie.
Si vous voulez échapper automatiquement tous JSP variables sans avoir explicitement envelopper chaque variable, vous pouvez utiliser un EL de résolution comme détaillé ici avec plein de source et un exemple (JSP 2.0 ou plus récente), et discuté plus en détail ici:
Par exemple, en utilisant le ci-dessus mentionné EL résolveur, votre code JSP restera comme ça, mais chaque variable sera automatiquement échappées par le solveur
Si vous voulez la force de s'échapper par défaut au Printemps, vous pourriez envisager de cela, mais il n'échappe pas à EL expressions, juste la balise de sortie, je pense:
http://forum.springsource.org/showthread.php?61418-Spring-cross-site-scripting&p=205646#post205646
Remarque: une Autre approche de EL échappement qui utilise des transformations XSL pour prétraiter les fichiers JSP peuvent être trouvés ici:
http://therning.org/niklas/2007/09/preprocessing-jsp-files-to-automatically-escape-el-expressions/
Si vous voulez vous assurer que votre
$
opérateur ne souffre pas de XSS hack vous pouvez mettre en œuvreServletContextListener
et faire quelques vérifications de là.La solution complète à: http://pukkaone.github.io/2011/01/03/jsp-cross-site-scripting-elresolver.html
De nouveau: on ne garde la
$
. Veuillez également consulter les autres réponses.