阅读完这个问题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
我该如何重现这个问题?
{(关键字"a :b"):c}
- cfrickclojure.core/keyword
的实际安全影响。clojure.core/keyword
不验证其输入以检查是否包含空格,因此虽然规范可能不允许带有空格的关键字,但如果向其中传递任意的用户提供的字符串,则完全可以创建这样的关键字。其次,读取器故意接受符合该规范“不正确”的(无空格)关键字——回到2013年,提交了一个使其更加严格的补丁,但破坏了现有代码并被撤销了。 - Michał Marczyk<
、>
和=
- 请参见此问题。虽然这与keyword
的行为直接相关,但它表明即使读取器对符号和关键字字面量比规范更宽容。 </end tangent>;-) - Michał Marczyk