我使用Clojure/Ring/Compojure-0.4/Enlive堆棧來構建Web應用程序。在Clojure/Compojure中逃脫/消毒用戶輸入
此堆棧中是否有函數爲了防止XSS攻擊而剝離HTML或HTML編碼(即<a>
到<a>
)用戶提供的字符串?
我使用Clojure/Ring/Compojure-0.4/Enlive堆棧來構建Web應用程序。在Clojure/Compojure中逃脫/消毒用戶輸入
此堆棧中是否有函數爲了防止XSS攻擊而剝離HTML或HTML編碼(即<a>
到<a>
)用戶提供的字符串?
事實證明Enlive 確實如果您使用net.cgrand.enlive-html/content
將文本放入HTML元素,則默認轉義HTML。
(sniptest "<p class=\"c\"></p>" [:.c] (content "<script></script>"))
"<p class=\"c\"><script></script></p>"
更新:我知道必須有比這更...
ring.util.codec
從ring-core
有一個叫功能,這工作就像這樣:
user> (require '[ring.util.codec :as c])
nil
user> (c/url-encode "<a>")
"%3Ca%3E"
user> (c/url-decode "<a>")
"<a>"
這些是包裝器java.net.URLEncoder
和java.net.URLDecoder
。基於Apache Commons的一個類,相同的命名空間提供了處理Base64編碼的函數。
原始答案如下。
我不知道是否有公共職能要做到這一點,但Enlive
有兩個私有函數調用xml-str
和attr-str
該這樣做:(attr-str
也逃脫"
)
(defn- xml-str
"Like clojure.core/str but escapes < > and &."
[x]
(-> x str (.replace "&" "&") (.replace "<" "<") (.replace ">" ">")))
您可以通過@#'net.cgrand.enlive-html/xml-str
(Clojure不傾向於使事情真的私人...)或只是將它複製到您自己的名稱空間。
hiccup.util/escape-html
in hiccup做到了。這個函數曾經是Compojure本身(因爲hiccup中的所有功能都曾經是Compojure的一部分)。這是一個簡單的功能,你可以很容易地自己寫。
(defn escape-html
"Change special characters into HTML character entities."
[text]
(.. #^String (as-str text)
(replace "&" "&")
(replace "<" "<")
(replace ">" ">")
(replace "\"" """)))
還有clojure.contrib.string/escape
,這需要地圖炭 - >字符串轉義序列和一個字符串,並逃脫它。
user> (clojure.contrib.string/escape {\< "<" \> ">"} "<div>foo</div>")
"<div>foo</div>"
這令我不是有用,因爲它可能是,因爲你可能想逃跑的多字符序列,這不會讓你。但它可能適用於HTML轉義需求。
然後,當然有很多Java庫。你可以使用StringEscapeUtils從Apache的百科全書:
(org.apache.commons.lang.StringEscapeUtils/escapeHtml4 some-string)
這令我有點重量級爲此,雖然。
StringEscapeUtils的正確URL http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringEscapeUtils.html – grm 2010-08-27 12:02:46
更新後的網址http://commons.apache.org/proper/commons-朗/ javadocs中/ API-3.1 /組織/阿帕奇/公地/ lang3/StringEscapeUtils.html – 2014-01-22 12:38:19
這有點令人失望。聽起來像是大多數Clojure Web框架中的主要監督。 – 2010-05-24 14:53:59
顯然情況並不那麼糟糕:請參閱最新的答案。:-) – 2010-05-24 15:08:34
看起來我有點倉促責怪Enlive,但無論如何感謝。 :) – 2010-05-25 09:54:40