代码之家  ›  专栏  ›  技术社区  ›  Rob Lachlan

从用户数据创建Clojure关键字的安全含义?

  •  8
  • Rob Lachlan  · 技术社区  · 16 年前

    假设我接受一个用户提供的字符串,userstring和call(关键字userstring)。

    这样做有什么安全问题吗?如果是这样的话,最好的缓解方法是什么?

    2 回复  |  直到 16 年前
        1
  •  7
  •   Brian Carper    16 年前

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

    米夏·马尔奇克说。请记住 #=() 可用于在读取时运行任意代码,因此您甚至不必计算字符串是否会发生不好的事情,您只需读取它。

    (keyword "foo #=(steal-passwords-and-delete-hard-drive)")
    

    (见 (doc *read-eval*) 了解如何禁用此行为,但默认情况下已启用read eval。)

    #"[a-zA-Z0-9*+!-_?]+" ,根据你所说的语言,可能还有其他字母数字。

        2
  •  6
  •   Michał Marczyk    16 年前

    在我的脑海里:

    (keyword s) 将创建一个名为 s

    (with-out-str (println (keyword "foo (println :bar)")))
    ; => :foo (println :bar)
    

    另外,这里有两个来自Google小组的感兴趣的线程(第一个来自clojure dev):

    1. Request for Improvement (with patch): non-interning keyword lookup

    2. Are keywords and symbols garbage-collected?

    总结:暂存垃圾关键字可能是内存泄漏,因此您应该考虑对字符串进行一些预处理,如果这些字符串来自不受信任的源,您可能会暂存它们。