阅读此问题后,从用户数据创建Clojure关键字的安全隐患?,特别是这个答案,我试图找到一个案例,我可以在REPL中证明这个问题.这是一个尝试:
user> *clojure-version* {:major 1, :minor 8, :incremental 0, :qualifier nil} user> (def a (atom 0)) #'user/a user> (defn bad-fn [] (println "called ") (swap! a inc)) #'user/bad-fn user> @a 0 user> (keyword "#=(bad-fn)") :#=(bad-fn) user> @a 0
我该如何重现这个问题?
问题不在于调用keyword
字符串会立即执行字符串中嵌入的任何代码,但如果您想将字符串表示存储(keyword "foo #=(println :bar)")
在文件中,然后使用该文件read
,则最终会执行嵌入代码.
当然,根本不建议read
用户提供字符串,但这个问题是关于安全性的,所以答案(Brian和我的)描述了可能因滥用各种设施而导致的安全问题以及keyword
具体命名的问题.
使用clojure.edn
(在2010年发布该问题时不可用)可以缓解#=
问题,但不能解决人们不应该期望能够读回(keyword
相同关键字的字符串表示的更广泛的问题,无论哪个读者使用.如果不考虑这一点很容易导致数据损坏.