如何转义/剥离LaTeX文档中的特殊字符?
我们实施了在线服务,可以生成具有预定义结构的PDF。用户可以选择LaTeX模板,然后使用适当的输入进行编译。
我们担心的问题是安全性,恶意用户无法通过向乳胶文档注入特殊指令来获得shell访问权限。
我们需要一些解决方法,或者至少需要一个应该从输入数据中删除的特殊字符列表。
首选语言是PHP,但非常欢迎任何建议,结构和链接。
PS.简而言之,我们正在寻找LaTeX mysql_real_escape_string
我们实施了在线服务,可以生成具有预定义结构的PDF。用户可以选择LaTeX模板,然后使用适当的输入进行编译。
我们担心的问题是安全性,恶意用户无法通过向乳胶文档注入特殊指令来获得shell访问权限。
我们需要一些解决方法,或者至少需要一个应该从输入数据中删除的特殊字符列表。
首选语言是PHP,但非常欢迎任何建议,结构和链接。
PS.简而言之,我们正在寻找LaTeX mysql_real_escape_string
下面是一些实现 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 );
}
使用LaTeX执行有害操作的唯一可能性(AFAIK)是允许使用\write18
调用外部命令的可能性。这仅适用于使用 --shell-escape 或 --enable-write18 参数运行 LaTeX 的情况(具体取决于您的发行版)。
因此,只要您不使用这些参数之一运行它,您就应该是安全的,而无需过滤掉任何部分。
除此之外,人们仍然能够使用 和 命令写入其他文件。让用户创建和(过度)写入文件可能是不需要的?因此,您可以筛选出这些命令的匹配项。但是,保留某些命令的黑名单很容易失败,因为意图不良的人可以通过混淆输入文档来轻松隐藏实际命令。\newwrite
\openout
\write
编辑:使用有限的帐户(即不写入非乳胶/项目相关目录)运行LaTeX命令并结合使用禁用可能比保留“危险”命令的黑名单更容易,更安全。\write18