当前位置:  开发笔记 > 前端 > 正文

在Clojure/Compojure中转义/清理用户输入

如何解决《在Clojure/Compojure中转义/清理用户输入》经验,为你挑选了2个好方法。

我正在使用Clojure/Ring/Compojure-0.4/Enlive堆栈来构建Web应用程序.

是否有在该堆叠函数要么带HTML或HTML编码(即,<a>),以防止跨站脚本攻击用户提供的字符串?



1> Brian Carper..:

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)

尽管如此,这让我觉得有点重量级.



2> Michał Marcz..:

更新:我知道必须有更多......

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.URLEncoderjava.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的不倾向于把事情真正的私人...),或只是将它复制到你自己的命名空间.


URL编码确实与HTML编码不同.url-encode("
")=>"%3Ca%3E",其中html-encode("")=>"< a>"
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有