如何转义/剥离LaTeX文档中的特殊字符?

2022-08-30 22:12:57

我们实施了在线服务,可以生成具有预定义结构的PDF。用户可以选择LaTeX模板,然后使用适当的输入进行编译。

我们担心的问题是安全性,恶意用户无法通过向乳胶文档注入特殊指令来获得shell访问权限。

我们需要一些解决方法,或者至少需要一个应该从输入数据中删除的特殊字符列表。

首选语言是PHP,但非常欢迎任何建议,结构和链接。

PS.简而言之,我们正在寻找LaTeX mysql_real_escape_string


答案 1

下面是一些实现 Geoff Reedy 答案的代码。我把这个代码放在公共领域。

<?

$test = "Test characters: # $ % & ~ _ ^ \ { }.";
header( "content-type:text/plain" );
print latexSpecialChars( $test );
exit;

function latexSpecialChars( $string )
{
    $map = array( 
            "#"=>"\\#",
            "$"=>"\\$",
            "%"=>"\\%",
            "&"=>"\\&",
            "~"=>"\\~{}",
            "_"=>"\\_",
            "^"=>"\\^{}",
            "\\"=>"\\textbackslash",
            "{"=>"\\{",
            "}"=>"\\}",
    );
    return preg_replace( "/([\^\%~\\\\#\$%&_\{\}])/e", "\$map['$1']", $string );
}

答案 2

使用LaTeX执行有害操作的唯一可能性(AFAIK)是允许使用\write18调用外部命令的可能性。这仅适用于使用 --shell-escape 或 --enable-write18 参数运行 LaTeX 的情况(具体取决于您的发行版)。

因此,只要您不使用这些参数之一运行它,您就应该是安全的,而无需过滤掉任何部分。

除此之外,人们仍然能够使用 和 命令写入其他文件。让用户创建和(过度)写入文件可能是不需要的?因此,您可以筛选出这些命令的匹配项。但是,保留某些命令的黑名单很容易失败,因为意图不良的人可以通过混淆输入文档来轻松隐藏实际命令。\newwrite\openout\write

编辑:使用有限的帐户(即不写入非乳胶/项目相关目录)运行LaTeX命令并结合使用禁用可能比保留“危险”命令的黑名单更容易,更安全。\write18


推荐