Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure.tools.logging EvalReader使用?_Clojure - Fatal编程技术网

clojure.tools.logging EvalReader使用?

clojure.tools.logging EvalReader使用?,clojure,Clojure,我认为这是clojure/tools.logging中的一个bug。我有以下db.clj文件。它做什么并不重要。重要的是,为了安全起见,我禁用了*read eval*。我调用db/start时没有问题。但是,如果我取消注释#(log/info“未能引导”)表单,它将抛出EvalReader not allowed错误。我尝试了log/info调用的各种组合。如果它在try块之外,则没有问题。在try块中的任何位置,无论是在主体中、catch还是finally中,它都会引发此异常。但是,当我将tr

我认为这是
clojure/tools.logging
中的一个bug。我有以下
db.clj
文件。它做什么并不重要。重要的是,为了安全起见,我禁用了
*read eval*
。我调用
db/start
时没有问题。但是,如果我取消注释
#(log/info“未能引导”)
表单,它将抛出
EvalReader not allowed
错误。我尝试了
log/info
调用的各种组合。如果它在
try
块之外,则没有问题。在
try
块中的任何位置,无论是在主体中、
catch
还是
finally
中,它都会引发此异常。但是,当我将
try
包装在
log/info
的其他地方时,就可以了

有什么好处

(ns extenium.db
  (:require [clojure.tools.logging :as log]
            [clojure.java.io :as io])
  (:import com.thinkaurelius.titan.core.TitanGraph
           com.thinkaurelius.titan.core.TitanFactory))

(def ^:private
  sentinel- (Object.))

(def ^:private
  db- (atom nil))

...

(defn start [^String path]
  (locking sentinel-
    (log/info "Starting database at path" path)
    (let [exists (.exists (io/file path))
          ^TitanGraph db_ (TitanFactory/open path)]
      (if exists
        (log/info "Path" path "exists")
        (log/info "Path" path "does not exist"))
      (log/info "Starting database engine")
      (swap! db- (constantly db_))
      (log/info "Started database engine")
      (if (not exists)
        (try
          (bootstrap-)
          (catch Throwable t
            #_(log/info "Failed to bootstrap")
            (stop)
            (.delete (io/file path))
            (throw t)))))
    (log/info "Started database")
    true))
编辑:根据@alex taggart精简代码。引导-未显示实现。我最初包含了所有内容,因为这看起来像是一个特定于上下文的bug,我觉得提供尽可能多的上下文更安全

编辑:根据@chouser,添加了我如何禁用
*读取eval*
。这是由新应用程序生成的模板

(defn -main
  "The main entry point into Extenium."
  [& args]
  ;; Prevent arbitrary eval injection
  (alter-var-root #'*read-eval* (constantly false))
  ;; Initialize system settings from the command line and configuration file
  (init!- args)
  ;; Start the service
  (start!-))

这不是虫子,真的。
clojure.tools.logging
库只是对其他Java日志设施的抽象。要发现哪一个可用,它使用
eval
表达式。欢迎您自己检查:这里是一个快速和简单的方法,可以使用它


在您的情况下,我认为没有必要关心全局
读取eval
。这是一个内部特性,谁知道其他库依赖于它。如果验证用户输入并阻止对其求值,则可以保持标记不变。我想说,SQL注入和XSS是您首先应该担心的事情。

如果您将示例代码限制在演示问题所需的范围内,这会有所帮助。您如何禁用
*read eval*
?通常,在传递不受信任的文本时,围绕
读取
读取字符串
等的特定用法使用
绑定
。加载您自己信任的
.clj
文件时,可能需要打开
*read eval*
,才能正常工作。