我正在使用Clojure/Ring/Compojure-0.4/Enlive堆栈构建web应用程序。
在这个堆栈中是否有函数可以剥离HTML或HTML编码(例如将<a>
编码为<a>
),以防止XSS攻击?
hiccup.util/escape-html
在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
函数,它接受一个 char -> string 转义序列的映射和一个字符串,然后为您进行转义。
user> (clojure.contrib.string/escape {\< "<" \> ">"} "<div>foo</div>")
"<div>foo</div>"
我觉得这个方法可能不如它本应该的有用,因为你可能想要转义多个字符的序列,而这个方法做不到。但如果你只需要对HTML进行转义,这个方法或许能够满足你的需求。
当然了,也有很多Java库可以实现这个功能。你可以使用Apache Commons中的StringEscapeUtils库。
(org.apache.commons.lang.StringEscapeUtils/escapeHtml4 some-string)
不过对于这个目的来说,这让我感觉有点过重。
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
可以实现此功能:
(defn- xml-str
"Like clojure.core/str but escapes < > and &."
[x]
(-> x str (.replace "&" "&") (.replace "<" "<") (.replace ">" ">")))
attr-str
会转义"
。)@#'net.cgrand.enlive-html/xml-str
来获取该函数(Clojure不倾向于将事物真正变成私有的...),或者将它复制到你自己的命名空间中。xml-str
确实使用&foo;
实体;很遗憾它是私有的。当然,根据上述问题,Brian的答案确实最合适。 - Michał Marczyknet.cgrand.enlive-html/content
将文本放入HTML元素时,默认会进行HTML转义。(sniptest "<p class=\"c\"></p>" [:.c] (content "<script></script>"))
"<p class=\"c\"><script></script></p>"