检测有害的 LaTeX 代码

检测有害的 LaTeX 代码

我正在编写一个网站,允许用户在预定义的文本字段中输入一些文本。这些文本将传递到服务器上,然后创建 LaTeX 文档(包含用户输入的文本)。服务器最终向用户返回编译后的 LaTeX 文档(pdf)。笔记:用户不需要输入整个 tex 文档,只需要输入部分内容。

我的问题:如何确保输入的文本不会损害我的服务器?即如何检测有害的 LaTeX 代码?

一些例子:

  • 用户输入了用 LaTeX 编写的无限循环,服务器无法编译该文档。

  • 用户输入了一个 shell 脚本,该脚本将在编译时从 tex 文件执行,这可能会导致我的服务器崩溃。

这是我黑名单的最佳替代方案任何LaTeX 代码?检测\后跟非空格是否足以阻止任何可能有害的 LaTeX 代码?

答案1

基于 web2c 的 tex 有相当多的自定义功能来控制这一点。正如著名的图灵定理,在任何非平凡编程语言中都不可能检测到所有可能的无限循环,因此如果 tex 代码是无限循环,\def\x{\x}\x它将永远循环下去,但是任何 Web 托管设置都应允许您为任何分叉进程指定时间限制,因此这实际上不是问题,您始终可以在您想要设置的任何时间限制之后终止该作业。

默认情况下不允许运行脚本,因此您的第二个担心只有在您允许它运行任意用户指定的命令时才会出现问题,所以不要这样做:-)

您可能还想通过禁止读取 /etc/passwd 等来限制读取输入树之外的文件的能力(默认情况下再次阻止写入此类文件)

控制texmf.cnf你的文本安装将有

% Do we allow TeX \input or \openin (openin_any), or \openout
% (openout_any) on filenames starting with `.' (e.g., .rhosts) or
% outside the current tree (e.g., /etc/passwd)?
% a (any)        : any file can be opened.
% r (restricted) : disallow opening dot files
% p (paranoid)   : as `r' and disallow going to parent directories, and
%                  restrict absolute paths to be under $TEXMFOUTPUT.
openin_any = a
openout_any = p

openin_any你可能还想p

除此之外,tex 与您可以做的任何其他事情一样安全,它不能产生任何新命令,它不能在启动目录(及其子目录)之外的任何地方写入,也不能从指定的输入路径中读取任何文件。

\endinput% this file is anti-social if this line is removed
\makeatletter
\ProvidesFile{xxx}[\noexpand\ver@xxx]
\ProvidesFile{xxx}[\ver@xxx]
\documentclass{article}


\begin{document}

\end{document}

答案2

检测以反斜杠开头的任何内容可能有些过分。在不知道文档内容的情况下,\emph{}\textsuperscript{}$\mu$m可能都是合理的。

您当然应该禁用 shell-escape 以防止运行任意命令。

您可能应该在某种沙箱中运行编译器(这在很大程度上取决于您的主机系统,因此即使我是专家,我也无法提供详细信息)。如果进程运行时间过长,您还可以使用看门狗来终止进程(听起来您对作业结构有很好的了解,并且可以预测运行时间)。设置文本很快,因此异常大的输入不会增加太多时间。

大多数挂起 LaTeX 编译器的尝试都更有可能导致其中止——可能出现“TeX 容量超出”错误。但当然,这可能需要一些时间。因此,合理的代码验证步骤可能是检查和阻止\def\newcommand以及等效项。这会让一些用户(比如这里的许多人)感到烦恼,但会使(故意或无意地)通过不受控制的递归等方式挂起编译器变得更加困难。有办法解决这个问题,\begin{def}因此将我们可以的任何环境列入白名单可能是个好主意\begin

相关内容