我正在使用Clojure/Ring/Compojure-0.4/Enlive堆栈来构建Web应用程序.
是否有在该堆叠函数要么带HTML或HTML编码(即,到
<a>
),以防止跨站脚本攻击用户提供的字符串?
hiccup.util/escape-html
在打嗝做到了.该函数曾经在Compojure本身(因为打嗝中的所有功能都曾是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 - >字符串转义序列和字符串的映射,并为您转义它.
user> (clojure.contrib.string/escape {\< "<" \> ">"} "foo") "<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 "") "%3Ca%3E" user> (c/url-decode "") ""
这些是包装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的不倾向于把事情真正的私人...),或只是将它复制到你自己的命名空间.