假设我获取用户提供的字符串 userstring,并对其进行调用(关键字 userstring)。
这样做是否存在任何安全问题?如果是这样,缓解这些问题的最佳方法是什么?
Per http://clojure.org/reader http://clojure.org/reader,符号和关键字中的字符有效是有规则的。 (目前,字母数字字符和*
, +
, !
, -
, _
, and ?
.) 您永远不应该创建包含任何其他字符的符号。然而,目前,编译器完全不强制执行这些规则。
充其量您最终可能会得到无效的关键字。在最坏的情况下,你可能会遇到邪恶/危险的事情,例如
米哈乌·马尔奇克说道。请记住#=()
可用于在读取时运行任意代码,因此您甚至不必评估字符串是否会发生不好的事情,您只需读取它即可。
(keyword "foo #=(steal-passwords-and-delete-hard-drive)")
(See (doc *read-eval*)
了解如何禁用此行为,但默认情况下会启用 read-eval。)
我认为清理用户输入的一般规则适用于此。精确定义您想要允许的内容,并默认禁止其他所有内容。也许允许像正则表达式这样的东西#"[a-zA-Z0-9*+!-_?]+"
,可能还有其他字母数字,具体取决于您所说的语言。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)