14

Clojure / Ring / Compojure-0.4/Enliveスタックを使用してWebアプリケーションを構築しています。

このスタックには、XSS攻撃を防ぐために、ユーザーが指定した文字列をHTMLまたはHTMLエンコード(つまり)で削除<a>する関数がありますか?&lt;a&gt;

4

3 に答える 3

19

hiccup.util/escape-htmlしゃっくりでそれを行います。その機能は以前は Compojure 自体にありました (hiccup の機能はすべて Compojure の一部であったため)。これは、自分で簡単に記述できるほど単純な関数です。

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

またclojure.contrib.string/escape、 char -> string エスケープ シーケンスのマップと文字列を取得してエスケープする もあります。

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

複数文字のシーケンスをエスケープしたいかもしれませんが、これではできないため、これは可能な限り有用ではないと思います。しかし、HTML エスケープのニーズにはうまくいくかもしれません。

もちろん、これには多くのJavaライブラリがあります。Apache Commonsの StringEscapeUtilsを使用できます。

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

ただし、これはこの目的には少し重いと思います。

于 2010-05-24T16:35:03.837 に答える
15

更新:それ以上のものがあるはずだとわかっていました...

ring.util.codecfromring-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 エンコーディングを処理するための関数を提供します。


元の答えは次のとおりです。

これを行うパブリック関数があるかどうかはわかりませんが、Enlive2 つのプライベート関数が呼び出されxml-strattr-strこれが実行されます。

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

(attr-strも逃げ"ます。)

(Clojureは物事を本当に@#'net.cgrand.enlive-html/xml-strプライベートにする傾向はありません...)でその機能を取得するか、独自の名前空間にコピーするだけです。

于 2010-05-24T14:21:57.277 に答える
4

テキストを HTML 要素に挿入する場合、Enliveはデフォルトで HTML をエスケープします。net.cgrand.enlive-html/content

(sniptest "<p class=\"c\"></p>" [:.c] (content "<script></script>"))
"<p class=\"c\">&lt;script&gt;&lt;/script&gt;</p>"
于 2010-05-25T09:54:09.273 に答える