从用户数据创建Clojure关键字的安全隐患?

Rob*_*lan 8 security clojure keyword

假设我在其上使用用户提供的字符串,用户字符串和调用(关键字用户字符串).

这样做是否有任何安全问题?如果是这样,减轻它们的最佳方法是什么?

Bri*_*per 7

根据http://clojure.org/reader,有符号和关键字中字符有效的规则.(目前,字母数字字符和*,+,!,-,_,和?).你不应该创建一个包含任何其他字符的符号.但是,目前,这些规则完全没有被编译器强制执行.

充其量你最终可能会得到无效的关键字.MichałMarczyk说,在最坏的情况下,你最终可能会遇到邪恶/危险的.请记住,#=()可以在读取时使用任意代码运行任意代码,因此您甚至不必为不良事件评估字符串,您只需要阅读它.

(keyword "foo #=(steal-passwords-and-delete-hard-drive)")
Run Code Online (Sandbox Code Playgroud)

(请参阅(doc *read-eval*)如何禁用此行为,但默认情况下启用了read-eval.)

我认为清理用户输入的一般规则适用于此处.准确定义您想要允许的内容,并默认禁止其他所有内容.也许允许像正则表达式这样的东西#"[a-zA-Z0-9*+!-_?]+",可能还有其他的字母数字取决于你说的语言.


Mic*_*zyk 6

脱离我的头顶:

(keyword s)将创建一个带有名称的非命名空间关键字,s无论这个关键字是否可以由关键字文字表示.如果您要将这些关键字作为某些配置文件的一部分打印出来,那么这可能是一个安全问题,然后尝试将其用作可信代码:

(with-out-str (println (keyword "foo (println :bar)")))
; => :foo (println :bar)
Run Code Online (Sandbox Code Playgroud)

此外,以下是来自Google网上论坛的两个主题(第一个来自clojure-dev):

  1. 要求改进(带补丁):非实习关键字查找

  2. 垃圾收集的关键字和符号是什么?

摘要:实习垃圾关键字可能是内存泄漏,因此您应该考虑对可能实习的字符串进行一些预处理,如果它们来自不受信任的来源.