如何安全地读取不受信任的 Clojure 代码(不仅仅是一些序列化数据)?

2023-11-24

(def evil-code (str "(" (slurp "/mnt/src/git/clj/clojure/src/clj/clojure/core.clj") ")" ))
(def r (read-string evil-code ))

有效,但不安全

(def r (clojure.edn/read-string evil-code))
RuntimeException Map literal must contain an even number of forms  clojure.lang.Util.runtimeException (Util.java:219)

不起作用...

如何安全地将 Clojure 代码(保留所有“#”本身)安全地读入树中?想象一下,一个 Clojure 防病毒软件想要扫描代码中是否存在威胁,并且想要使用数据结构,而不是纯文本。


首先,您永远不应该直接从不受信任的数据源读取 clojure 代码。您应该使用 EDN 或其他序列化格式。

话虽这么说,从 Clojure 1.5 开始,有一种安全的方法可以读取字符串而不需要评估它们。你应该绑定读取-评估在使用 read-string 之前将 var 设置为 false。在 Clojure 1.4 及更早版本中,这可能会因调用 java 构造函数而产生副作用。这些问题现已得到解决。

这是一些示例代码:

(defn read-string-safely [s]
  (binding [*read-eval* false]
    (read-string s)))

(read-string-safely "#=(eval (def x 3))")
=> RuntimeException EvalReader not allowed when *read-eval* is false.  clojure.lang.Util.runtimeException (Util.java:219)

(read-string-safely "(def x 3)")
=> (def x 3)

(read-string-safely "#java.io.FileWriter[\"precious-file.txt\"]")
=> RuntimeException Record construction syntax can only be used when *read-eval* == true  clojure.lang.Util.runtimeException (Util.java:219)

关于阅读器宏

调度宏 (#) 和标记文字在读取时调用。 Clojure 数据中没有它们的表示,因为到那时这些结构都已被处理。据我所知,没有构建方法来生成 Clojure 代码的语法树。

您将必须使用外部解析器来保留该信息。您可以使用自己的自定义解析器,也可以使用 Instaparse 和 ANTLR 等解析器生成器。可能很难找到这两个库的完整 Clojure 语法,但您可以扩展其中一个 EDN 语法以包含其他 Clojure 形式。谷歌快速揭晓Clojure 语法的 ANTLR 语法,如果需要,您可以更改它以支持缺少的结构。

还有Sjacket为 Clojure 工具制作的库,需要保留有关源代码本身的信息。这似乎很适合你想做的事情,但我个人没有任何经验。从测试来看,它的解析器确实支持读取器宏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何安全地读取不受信任的 Clojure 代码(不仅仅是一些序列化数据)? 的相关文章

随机推荐

  • 设置iframe的内容

    我有以下结构 div p Hello World p div 我有以下 JavaScript 变量content var s div Test Div div 如何更改带有id的iframe的内容myiframe有变量s I tried m
  • $.getJSON 中的 beforeSend

    我该如何使用beforeSend回调中 getJSON 跨域 进一步来说 getJSON调用的是 YQL 服务 喜欢 从 html 中选择 其中 网址 http www yahoo com 唯一的目的就是发送前是获取原始 XHR 对象 通常
  • 惰性量词 {,}?没有按我的预期工作

    我对惰性量词有疑问 或者很可能我误解了我应该如何使用它们 测试于Regex101我的测试字符串是 123456789D123456789 1 5 火柴12345 1 5 火柴1 我对两场比赛都满意 1 5 D火柴56789D 我希望它能够匹
  • 创建对象时 Javascript“不是构造函数”异常

    我定义一个这样的对象 function Project Attributes ProjectWidth ProjectHeight this ProjectHeight ProjectHeight this ProjectWidth Pro
  • SQL Server 集成服务 2008-2005 兼容性

    我最近在我的开发机器上使用 2008 版本开发了一个 SSIS 包 后来我发现客户有Sql server 2005并且不打算很快升级 有没有办法将 2008 包变成 SSIS 2005 包 就像降级向导一样 感谢一位未透露姓名的消息来源 我
  • OpenSSL:无法在 VC++ 2010 中构建

    我已经下载了最新的OpenSSL源码包 我想用 VC 2010 x64 构建它 按照说明操作似乎不起作用 配置步骤看起来不错 但是 C 1 gt ms do win64a bat C 1 gt perl util mkfiles pl 1
  • 使用 SymPy 将符号表达式转换为 Python 函数

    我有一个相当大的符号函数 它针对循环中参数的不同值进行评估 在每次迭代中 在找到函数的表达式后 导出偏导数 像这样的东西 from sympy import diff symbols exp def lagrange eqs a x y z
  • 如何使用 EV SHA2 证书对 ClickOnce 部署进行身份验证并避免“未知发布者”

    通过 Visual Studio 的项目 签名 设置页面对我的 ClickOnce 部署进行签名时 我指定了 SHA2 SHA256 EV Authenticode 证书并发布 发布并尝试运行引导程序 setup exe 后 我会在 Cli
  • 为什么我的观察者会因同一个更改而被调用两次?

    我有一个 AngularJS 1 4 应用程序在本地运行 尚未 该应用程序由 Laravel 5 1 后端 RESTFul API 提供服务 我必须制作这个代表打包旅行的应用程序 一个包裹由天组成 范围从0天到N天 每天都有一个服务列表 范
  • 函数calculate.overlap的输出顺序

    我正在 R 包 VennDiagram 中使用 calculate overlap 函数 我比较了四组数据如下 library VennDiagram overlap calculate overlap x list 1 1 2 2 3 3
  • 通过 script 标签加载外部 javascript

    我正在尝试使用脚本标记动态加载脚本 但我做不到 我的渲染方法如下 render div a href http www authorize net target blank Working Yipee a div 我尝试使用angerous
  • 如何扩展/膨胀 numpy 数组?

    我正在执行图像分析并以布尔值的形式生成种子array import numpy as np Example output array a np array False False False False True False False F
  • 布尔恒等 == True 与 is True

    这是使用的标准约定if foo is None而不是if foo None测试一个值是否是特定的None 如果你想确定一个值是否精确True 不仅仅是一个类似真实的值 有什么理由使用if foo True而不是if foo is True
  • 如何在C#中对数组列表的元素进行排序

    我有一个 ArrayList 其中包含 0 1 1 10 2 2 3 15 4 17 5 5 6 6 7 27 8 8 9 9 现在我需要对数组列表进行排序 使其变为 0 1 1 2 2 5 3 6 4 8 5 9 6 10 7 15 8
  • 如何在 flutter 应用程序中实现 reCaptcha

    我正在尝试在我的 flutter 应用程序中实现 reCaptcha 功能 但在验证码注册中 我需要提供一个域 而我没有用于移动应用程序的域 我浏览过一些指导如何在移动应用程序中实现 reCaptcha 的指南 但这些指南使用包名称而不是域
  • 添加非mvc路由时Html.ActionLink构造错误链接

    我这里有一个混合了 webform 和 mvc 的应用程序 我指定路由如下 routes Add AspxRoute new Route Upload New new WebFormRouteHandler
  • 给定时间内的 Cron 作业和随机时间

    我需要能够每天在完全随机的时间运行 PHP 脚本 20 次 我还希望它仅在上午 9 点至晚上 11 点之间运行 我熟悉在 Linux 中创建 cron 作业 如何在上午 9 点到晚上 11 点之间每天随机执行 20 次定时任务 这在 cro
  • 防止 UIAlertView 关闭

    作为一种验证形式 有什么方法可以防止按下 确定 按钮时警报视图消失 场景 我在警报视图中有 2 个用于用户名 密码的文本字段 如果两者都是空并且用户按 确定 我不希望警报被解除 iOS 5 引入了一个新属性UIAlertView来准确处理这
  • 从哪里开始使用 CPanel 托管在 PHP 中运行命令行

    我正在查看一些 PayPal 脚本 代码示例 其中很多需要通过命令行运行的 php 脚本 我以前从未在 PHP 中从命令行运行过任何东西 所以根本不知道从哪里开始 我不知道我是否使用了正确的搜索词 因为谷歌没有帮助我回答 我是否需要使用不同
  • 如何安全地读取不受信任的 Clojure 代码(不仅仅是一些序列化数据)?

    def evil code str slurp mnt src git clj clojure src clj clojure core clj def r read string evil code 有效 但不安全 def r cloju