2010-05-24 2 views
13

Ich benutze Clojure/Ring/Compojure-0.4/Enlive-Stack, um eine Webanwendung zu erstellen.Escape/desinfizieren Benutzereingabe in Clojure/Compojure

Gibt es Funktionen in diesem Stapel, die entweder HTML- oder HTML-codierte (d. H. <a> bis &lt;a&gt;) benutzerdefinierte Zeichenfolgen entfernen, um XSS-Angriffe zu verhindern?

Antwort

3

Es stellt sich heraus, Enlive tut Escape HTML standardmäßig, wenn Sie net.cgrand.enlive-html/content verwenden, um Text in ein HTML-Element zu setzen.

(sniptest "<p class=\"c\"></p>" [:.c] (content "<script></script>")) 
"<p class=\"c\">&lt;script&gt;&lt;/script&gt;</p>" 
14

Update: Ich wusste, dass es mehr als das sein ...

ring.util.codec von ring-core hat eine Funktion aufgerufen, die wie so funktionieren:

user> (require '[ring.util.codec :as c]) 
nil 
user> (c/url-encode "<a>") 
"%3Ca%3E" 
user> (c/url-decode "<a>") 
"<a>" 

Dies sind Wrapper um java.net.URLEncoder und java.net.URLDecoder . Derselbe Namespace bietet Funktionen für den Umgang mit der Base64-Codierung basierend auf einer Klasse von Apache Commons.


Ursprüngliche Antwort folgt.

Ich bin nicht sicher, ob es eine öffentliche Funktion, dies zu tun ist, aber Enlive verfügt über zwei private Funktionen xml-str und attr-str genannt, die dies tun: (. attr-str auch entkommt ")

(defn- xml-str 
"Like clojure.core/str but escapes < > and &." 
[x] 
    (-> x str (.replace "&" "&amp;") (.replace "<" "&lt;") (.replace ">" "&gt;"))) 

Sie könnten bei dieser Funktion mit @#'net.cgrand.enlive-html/xml-str bekommen (Clojure neigt nicht dazu, Sachen wirklich privat zu machen) oder kopieren Sie es einfach in Ihren eigenen Namespace.

+0

Das ist ein bisschen schade. Klingt wie ein großes Versehen in den meisten Clojure Web-Frameworks. –

+1

Anscheinend ist die Situation nicht ganz so schlimm: siehe die aktualisierte Antwort.:-) –

+1

Sieht so aus, als wäre ich ein wenig eilig, um Enlive die Schuld zu geben, aber danke trotzdem. :) –

17

hiccup.util/escape-html in hiccup tut es. Diese Funktion war früher in Compojure (da die gesamte Funktionalität in Schluckauf Teil von Compojure war). Es ist eine einfache Funktion, die Sie leicht selbst schreiben könnten.

(defn escape-html 
    "Change special characters into HTML character entities." 
    [text] 
    (.. #^String (as-str text) 
    (replace "&" "&amp;") 
    (replace "<" "&lt;") 
    (replace ">" "&gt;") 
    (replace "\"" "&quot;"))) 

Es gibt auch clojure.contrib.string/escape, die Karte von char nimmt -> string Escape-Sequenzen und einen String und entkommt es für Sie.

user> (clojure.contrib.string/escape {\< "&lt;" \> "&gt;"} "<div>foo</div>") 
"&lt;div&gt;foo&lt;/div&gt;" 

Dies scheint mich nicht so nützlich, wie es sein könnte, weil man mit mehreren Zeichenfolge entkommen möchte, und dies wird nicht im Stich lassen. Aber es könnte für Ihre HTML-entweichenden Bedürfnisse funktionieren.

Und dann gibt es natürlich viele Java-Bibliotheken. Sie könnten StringEscapeUtils von Apache Commons verwenden:

(org.apache.commons.lang.StringEscapeUtils/escapeHtml4 some-string) 

Dies scheint mir ein bisschen Schwergewicht für diesen Zweck allerdings.

+1

Die richtige URL zu StringEscapeUtils http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringEscapeUtils.html – grm

+0

Aktualisierte URL http://commons.apache.org/proper/commons- lang/javadocs/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html –