Rob*_*lan 8 security clojure keyword
假设我在其上使用用户提供的字符串,用户字符串和调用(关键字用户字符串).
这样做是否有任何安全问题?如果是这样,减轻它们的最佳方法是什么?
根据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*+!-_?]+",可能还有其他的字母数字取决于你说的语言.
脱离我的头顶:
(keyword s)将创建一个带有名称的非命名空间关键字,s无论这个关键字是否可以由关键字文字表示.如果您要将这些关键字作为某些配置文件的一部分打印出来,那么这可能是一个安全问题,然后尝试将其用作可信代码:
(with-out-str (println (keyword "foo (println :bar)")))
; => :foo (println :bar)
Run Code Online (Sandbox Code Playgroud)
此外,以下是来自Google网上论坛的两个主题(第一个来自clojure-dev):
摘要:实习垃圾关键字可能是内存泄漏,因此您应该考虑对可能实习的字符串进行一些预处理,如果它们来自不受信任的来源.