J'utilise Clojure/Ring/Compojure-0.4/Enlive pour créer une application Web. Y a-t-il des fonctions dans cette pile qui dépouilleraient les chaînes fournies par l'utilisateur HTML ou HTML (c'est-à-dire <a>
à <a>
) afin d'empêcher les attaques XSS?Échapper/désinfecter l'entrée de l'utilisateur dans Clojure/Compojure
Répondre
Il s'avère qu'Enlive échappe HTML par défaut si vous utilisez net.cgrand.enlive-html/content
pour mettre du texte dans un élément HTML.
(sniptest "<p class=\"c\"></p>" [:.c] (content "<script></script>"))
"<p class=\"c\"><script></script></p>"
Mise à jour: Je savais qu'il devait y avoir plus que ça ...
ring.util.codec
de ring-core
a une fonction appelée qui fonctionnent comme ceci:
user> (require '[ring.util.codec :as c])
nil
user> (c/url-encode "<a>")
"%3Ca%3E"
user> (c/url-decode "<a>")
"<a>"
Ce sont des emballages autour java.net.URLEncoder
et java.net.URLDecoder
. Le même espace de noms fournit des fonctions pour traiter le codage Base64, basé sur une classe d'Apache Commons.
La réponse originale suit.
Je ne suis pas certain qu'il y ait une fonction publique de le faire, mais Enlive
a deux fonctions privées appelées xml-str
et attr-str
qui font ceci: (. attr-str
échappe également "
)
(defn- xml-str
"Like clojure.core/str but escapes < > and &."
[x]
(-> x str (.replace "&" "&") (.replace "<" "<") (.replace ">" ">")))
Vous pouvez obtenir à cette fonction avec @#'net.cgrand.enlive-html/xml-str
(Clojure n'a pas tendance à faire les choses vraiment privé ...) ou simplement le copier dans votre propre espace de noms.
hiccup.util/escape-html
dans hiccup le fait. Cette fonction était auparavant dans Compojure (puisque toutes les fonctionnalités de hoquet faisaient partie de Compojure). C'est une fonction assez simple que vous pourriez facilement écrire vous-même.
(defn escape-html
"Change special characters into HTML character entities."
[text]
(.. #^String (as-str text)
(replace "&" "&")
(replace "<" "<")
(replace ">" ">")
(replace "\"" """)))
Il y a aussi clojure.contrib.string/escape
, qui prend une carte de Char -> séquences d'échappement de chaîne et une chaîne et il échappe pour vous.
user> (clojure.contrib.string/escape {\< "<" \> ">"} "<div>foo</div>")
"<div>foo</div>"
Cela me paraît pas aussi utile qu'elle pourrait l'être, parce que vous pouvez échapper à des séquences multi-caractères et cela ne vous laissera pas. Mais cela pourrait fonctionner pour vos besoins d'échappement HTML.
Et puis il y a beaucoup de bibliothèques Java pour cela, bien sûr. Vous pouvez utiliser StringEscapeUtils de Apache Commons:
(org.apache.commons.lang.StringEscapeUtils/escapeHtml4 some-string)
Cela me frappe comme un poids lourd de peu à cet effet si.
L'URL correcte de StringEscapeUtils http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringEscapeUtils.html – grm
Mise à jour de l'URL http://commons.apache.org/proper/commons- lang/javadocs/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html –
C'est un peu décevant. Cela ressemble à un oubli majeur dans la plupart des frameworks web de Clojure. –
Apparemment, la situation n'est pas si mauvaise: voir la réponse mise à jour.:-) –
On dirait que j'étais un peu hâtive de blâmer Enlive, mais merci quand même. :) –