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中也将它禁用,使其更安全?