17.13 Code Evaluation and Security Issues

与纯文本不同,运行代码存在风险,每个代码块的风险等同于可执行文件。因此 Org 默认添加多项确认提示,提醒普通用户避免意外运行不受信任的代码。

不常运行或编写代码块的用户,Org 默认设置已足够。部分用户可能希望调整提示以减少中断,以下是代码执行的相关风险说明。

Org 在以下场景执行代码:

源代码块

Org 导出时会执行 Org 文件中的源代码块,按下 C-c C-c 也可执行代码块。导出或运行代码块的用户仅应加载受信任来源的文件,谨慎自定义移除或修改默认安全措施的变量。

User Option: org-confirm-babel-evaluate

t 时,执行每个代码块前提示用户确认;为 nil 时,直接执行代码块不提示。若设置为自定义函数,Org 会以源代码语言和代码块内容为参数调用该函数,函数返回 tnil 决定是否提示,可通过该参数分别处理不同源代码语言。

以下示例实现不提示直接执行 ditaa 代码块:

(defun my-org-confirm-babel-evaluate (lang body)
  (not (string= lang "ditaa")))  ; 不提示 ditaa
(setq org-confirm-babel-evaluate #'my-org-confirm-babel-evaluate)
执行 ‘shell’ 和 ‘elisp’ 链接

Org 有两种可直接执行代码的链接类型(参见 External Links)。由于代码不可见,这类链接存在潜在风险,因此 Org 遇到此类链接时会提示用户,相关自定义变量为:

执行 shell 链接前提示用户的函数。

执行 Emacs Lisp 链接前提示用户的函数。

表格公式

表格中的公式(参见 The Spreadsheet)由 Calc 解释器或 Emacs Lisp 解释器执行。