当前位置:  开发笔记 > 程序员 > 正文

Clojure关键字示例安全问题

如何解决《Clojure关键字示例安全问题》经验,为你挑选了1个好方法。

阅读此问题后,从用户数据创建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

我该如何重现这个问题?



1> Michał Marcz..:

问题不在于调用keyword字符串会立即执行字符串中嵌入的任何代码,但如果您想将字符串表示存储(keyword "foo #=(println :bar)")在文件中,然后使用该文件read,则最终会执行嵌入代码.

当然,根本不建议read用户提供字符串,但这个问题是关于安全性的,所以答案(Brian和我的)描述了可能因滥用各种设施而导致的安全问题以及keyword具体命名的问题.

使用clojure.edn(在2010年发布该问题时不可用)可以缓解#=问题,但不能解决人们不应该期望能够读回(keyword )相同关键字的字符串表示的更广泛的问题,无论哪个读者使用.如果不考虑这一点很容易导致数据损坏.


简短示例(数据损坏):`{(关键字"a:b"):c}`
推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有