gpt4 book ai didi

security - 你如何安全地解析 Common Lisp 中不受信任的输入?

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:43 27 4
gpt4 key购买 nike

如何在 Common Lisp 中安全地解析不受信任的输入?鉴于没有 parse-float 等,并且从字符串中读取将执行读取器宏,如#。 (读取时间评估)。

例如 (从字符串中读取 "#.(+ 1 2)") => 3

最佳答案

我找不到描述 Common Lisp 的一些安全输入处理过程的其他问题或评论(如果有人找到它们,请发表评论!),但至少有两件重要的事情你可能做:

  • 使用with-standard-io-syntax以确保您正在使用标准可读表等进行阅读。请注意,这会将 *read-eval* 绑定(bind)为 true,因此请确保还:
  • 绑定(bind)*read-eval*为假( with-standard-io-syntax)。这将禁用问题中提到的 sharpsign-dot (#.) 宏。
(let ((*readtable* (copy-readtable)))
(set-macro-character #\n (constantly 'injected))
(read-from-string "(#.(+ 2 5) n)"))
;;=> (7 INJECTED)

(let ((*readtable* (copy-readtable)))
(set-macro-character #\n (constantly 'injected))
(with-standard-io-syntax
(let ((*read-eval* nil))
(read-from-string "(#.(+ 2 5) n)"))))
;; Evaluation aborted on #<SB-INT:SIMPLE-READER-ERROR
;; "can't read #. while *READ-EVAL* is NIL" {1004DA3603}>.

(let ((*readtable* (copy-readtable)))
(set-macro-character #\n (constantly 'injected))
(list (read-from-string "(n)")
(with-standard-io-syntax
(let ((*read-eval* nil))
(read-from-string "(n)")))))
;; ((INJECTED) (N))

关于security - 你如何安全地解析 Common Lisp 中不受信任的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34813891/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com