Clojure / Ring / Compojure-0.4/Enliveスタックを使用してWebアプリケーションを構築しています。
このスタックには、XSS攻撃を防ぐために、ユーザーが指定した文字列をHTMLまたはHTMLエンコード(つまり)で削除<a>
する関数がありますか?<a>
hiccup.util/escape-html
しゃっくりでそれを行います。その機能は以前は 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
fromring-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
2 つのプライベート関数が呼び出されxml-str
、attr-str
これが実行されます。
(defn- xml-str
"Like clojure.core/str but escapes < > and &."
[x]
(-> x str (.replace "&" "&") (.replace "<" "<") (.replace ">" ">")))
(attr-str
も逃げ"
ます。)
(Clojureは物事を本当に@#'net.cgrand.enlive-html/xml-str
プライベートにする傾向はありません...)でその機能を取得するか、独自の名前空間にコピーするだけです。
テキストを HTML 要素に挿入する場合、Enliveはデフォルトで HTML をエスケープします。net.cgrand.enlive-html/content
(sniptest "<p class=\"c\"></p>" [:.c] (content "<script></script>"))
"<p class=\"c\"><script></script></p>"