如何在LaTeX文档中转义/删除特殊字符?

Igo*_*gor 15 php latex escaping strip

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

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

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

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

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

Chr*_*dge 15

这是一些实现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 );
}
Run Code Online (Sandbox Code Playgroud)

  • 您需要将"\\ textbackslash"更改为"\\ textbackslash {}"以确保在反斜杠立即出现在文本之前时进行正确处理.我试图编辑它,但stackoverflow不允许两个字符编辑:-( (6认同)

Veg*_*ger 3

使用 LaTeX 执行有害操作的唯一可能性(AFAIK)是启用使用\write18. 仅当您使用 --shell-escape 或 --enable-write18 参数(取决于您的发行版)运行 LaTeX 时,这才有效。

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

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

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