clojure.xml 默认处理 XML 外部实体。这允许在处理的XML中包含外部文件,既可以是本地文件系统也可以是远程服务器。当 处理不受信任的输入 时,这似乎是个糟糕的想法。
以下是一个示例,其中在结果中包含 /etc/hostname
(如果您计算机上没有那个文件,结果是 FileNotFoundException)。
(require 'clojure.xml)
(def xml-str "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM \"file:///etc/hostname\" >]>
<foo>&xxe;</foo>")
(with-open [input (java.io.ByteArrayInputStream. (.getBytes xml-str))]
(clojure.xml/parse input))
;; => {:tag :foo, :attrs nil, :content ["nixos\n"]}
据我所知,这个特性很少使用,例如 data.xml 默认会禁用它。我们可以在 clojure.xml 中也禁用它,以便默认更安全吗?