我是一名程序员,作为网站的一部分,我需要能够获取 LaTeX 源文件并对其进行编译,然后将 pdf 返回给用户。这似乎很危险,因为恶意用户可以通过这种方式在服务器上读取和写入文件。是否可以“清理”LaTeX 文件,以便安全地进行编译,还是太复杂了?
答案1
其中texmf.cnf
有一些选项可以限制 TeX 文档的功能。从安全角度来看,最重要的是(使用我本地 texmf.cnf 中的值,这些值可能是也可能不是您系统上的默认值):
% Enable system commands via \write18{...}. When enabled fully (set to
% 1), obviously insecure. When enabled partially (set to p), only the
% commands listed in shell_escape_commands are allowed. Although this
% is not fully secure either, it is much better, and so useful that we
% enable it for everything but bare tex.
shell_escape = p
% Special: convert is the standard command name for ImageMagick, but it
% is also the name of a dangerous filesystem-changing command on
% Windows. So enable imgconvert (used in w32tex), but not convert.
% No spaces in this command list.
shell_escape_commands = \
bibtex,bibtex8,dvips,epstopdf,epspdf,etex,fc-match,\
imgconvert,\
kpsewhich,makeindex,mkgrkindex,\
pdfluatex,ps2pdf,ps4pdf,pstopdf,pygmentize,\
rpdfcrop,texindy,xindy,ulqda\
% plain TeX should remain unenhanced.
shell_escape.tex = f
我认为您可能希望将其简单地设置为shell_escape = f
。
% Allow TeX \openin, \openout, or \input 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 "dotfiles".
% p (paranoid) : as 'r' and disallow going to parent directories, and
% restrict absolute paths to be under $TEXMFOUTPUT.
openout_any = p
openin_any = a
这允许任何人读取您系统上的任何文件(如果用户拥有必要的权限),因此您可能也想改变这一点。
% Allow TeX and MF to parse the first line of an input file for
% the %&format construct.
parse_first_line = t
这可能会导致使用非预期的另一个宏包读取 tex 文件 - 我不知道这是否至关重要,但您应该考虑一下。
% Enable the mktex... scripts by default? These must be set to 0 or 1.
% Particular programs can and do override these settings, for example
% dvips's -M option. Your first chance to specify whether the scripts
% are invoked by default is at configure time.
%
% These values are ignored if the script names are changed; e.g., if you
% set DVIPSMAKEPK to `foo', what counts is the value of the environment
% variable/config value `FOO', not the `MKTEXPK' value.
%
% MKTEXTEX = 0
% MKTEXPK = 0
% MKTEXMF = 0
% MKTEXTFM = 0
% MKTEXFMT = 0
% MKOCP = 0
% MKOFM = 0
这些设置(或非设置)决定是否在需要时自动生成所需文件(如字体/字体指标)。我不知道这是否会造成安全风险,但它肯定会延长编译时间。
稍后会设置一些内存限制,这也可能会有用。
您可以在 texmf.cnf 中全局更改这些设置,或者将它们作为环境变量提供给调用的程序(环境优先)。
命令行上也可以给出一些选项。
答案2
在配置texmf.cnf
文件中,您可以禁止执行外部程序。运行kpsewhich texmf.cnf
以找到文件的位置。
答案3
您可以过滤某些特定的宏,但肯定有办法解决这个问题。如果您不使用 TeX 本身,TeX 是一种非常复杂的语言,很难解析。
您需要确保该-shell-escape
选项已禁用,这已是默认设置。全局设置已启用,texmf.cnf
但无论如何都可以覆盖-no-shell-escape
。
您可能希望使用该-output-directory
选项或在安全目录中运行latex
编译器。但是这并不妨碍文档读取和写入其他目录中的文件。
对于类 Unix 操作系统,我建议在chroot环境中的系统文件最少,且用户只具有最低限度的读写权限。再加上禁用 shell 逃逸,应该会非常安全。