Comment échapper / supprimer des caractères spéciaux dans le document LaTeX?
nous avons implémenté le service en ligne où il est possible de générer des PDF prédéfinis structure. L'utilisateur peut choisir un modèle LaTeX et le compiler avec les entrées appropriées.
la question qui nous préoccupe est la sécurité, c'est-à-dire que l'utilisateur malveillant n'a pas pu obtenir l'accès au shell par l'injection d'une instruction spéciale dans le document latex.
nous avons besoin d'une solution pour cela ou au moins d'une liste de caractères spéciaux que nous devrions bande à partir des données d'entrée.
la langue préférée serait le PHP, mais toutes les suggestions, constructions et liens sont les bienvenus.
PS. en quelques mots, nous sommes à la recherche pour mysql_real_escape_string pour le LaTeX
5 réponses
la seule possibilité (AFAIK) d'effectuer des opérations nuisibles en utilisant LaTeX est d'activer la possibilité d'appeler des commandes externes en utilisant \write18
. Cela ne fonctionne que si vous exécutez LaTeX avec l'argument --shell-escape ou --enable-write18 (selon votre distribution).
aussi longtemps que vous ne l'exécutez pas avec l'un de ces arguments, vous devriez être en sécurité sans avoir besoin de filtrer les parties.
en plus de cela, on est encore capable d'écrire d'autres fichiers à l'aide de la \newwrite
,\openout
et \write
commandes. Le fait que l'utilisateur crée et (sur)écrive des fichiers pourrait être indésirable? Vous pouvez donc filtrer les occurrences de ces commandes. Mais garder des listes noires de certaines commandes est susceptible d'échouer car quelqu'un avec une mauvaise intention peut facilement cacher la commande réelle en obfusant le document d'entrée.
Modifier: exécuter la commande LaTeX en utilisant un compte limité (c'est-à-dire ne pas écrire à des répertoires non liés à latex/projet) dans combinaison avec handicap \write18
pourrait être plus facile et plus sûr que de conserver une liste noire de commandes "dangereuses".
voici du code pour implémenter la réponse Geoff Reedy. Je place ce code dans le domaine public.
<?
$test = "Test characters: # $ % & ~ _ ^ \ { }.";
header( "content-type:text/plain" );
print latexSpecialChars( $test );
exit;
function latexSpecialChars( $string )
{
$map = array(
"#"=>"\#",
"$"=>"\$",
"%"=>"\%",
"&"=>"\&",
"~"=>"\~{}",
"_"=>"\_",
"^"=>"\^{}",
"\"=>"\textbackslash",
"{"=>"\{",
"}"=>"\}",
);
return preg_replace( "/([\^\%~\\#$%&_\{\}])/e", "$map['']", $string );
}
en général, atteindre la sécurité uniquement en échappant aux séquences de commandes est difficile à faire sans réduire drastiquement l'expressivité, car il n'y a pas de manière de principe pour distinguer les cs sûrs des cs dangereux: Tex n'est tout simplement pas un langage de programmation assez propre pour permettre cela. Je dirais d'abandonner cette approche en faveur de l'élimination des failles de sécurité.
Veger résumé des trous de sécurité dans le Latex est conforme avec la mienne: c'est à dire, les questions sont de shell s'échappe et la création du fichier.l'écriture, bien qu'il ait manqué une vulnérabilité d'évasion d'obus. D'autres points suivent, puis des recommandations:
- il ne suffit pas d'éviter d'invoquer activement
--shell-escape
, car il peut être implicitement activé dans texmf.cnf. Vous devez transmettre explicitement--no-shell-escape
pour remplacer texmf.cnf; \write18
est une primitive D'Etex, pas Tex de Knuth. Donc, vous pouvez éviter les Latex qui l'implémentent (qui, malheureusement, est la plupart des eux);- si vous utilisez des Dvips, il y a un autre risque:
\special
commandes peuvent créer .les fichiers dvi qui demandent à dvips d'exécuter des commandes shell. Vous devez donc, si vous utilisez des dvips, passer le-R2
commande pour interdire l'invocation de commandes shell; - texmf.cnf vous permet de spécifier où Tex peut créer des fichiers;
- vous pourriez ne pas être en mesure d'éviter de désactiver la création de polices si vous voulez que vos clients disposent de beaucoup de liberté pour créer des polices. Jetez un oeil à les notes sur la sécurité pour Kpathsea; le comportement par défaut me semble raisonnable, mais vous pourriez avoir un par utilisateur arborescence de police, pour empêcher un utilisateur de marcher sur une autre utilisateurs orteils.
Options:
- Sandbox invocations en Latex de votre client, et leur permettre la liberté de mal se conduire dans le bac à sable;
- faites confiance aux valeurs par défaut de kpathsea, et interdisez à shell de s'échapper dans latex et tout autre exécutable utilisé pour construire le PDF de sortie;
- réduisez drastiquement l'expressivité, en interdisant à vos clients la possibilité de créer des fichiers de police ou de nouveaux fichiers spécifiés par le client. Exécutez latex comme un processus qui ne peut écrire que dans certains fichiers existants;
- vous pouvez créer un fichier de format dans lequel le
\write18
cs, et la création de fichier css, ne sont pas liés, et seules les macros qui les invoquent en toute sécurité, comme pour la création de police/toc/bbl, existent. Cela signifie que vous devez décider quelles fonctionnalités vos clients ont: ils ne seraient pas en mesure de choisir librement les paquets qu'ils importent, mais ils doivent faire usage des choix que vous leur avez imposés. Selon le type de 'templates' que vous avez en tête, cela pourrait être une bonne option, permettant l'utilisation de paquets qui utilisent des échappées de shell, mais vous devrez auditer le code TeX/Latex qui va dans votre fichier de format.
Postscript
Il y a un Remorqueur article, côté Serveur la génération de fichier PDF basé sur LATEX modèles, en adressant une autre question à celle que j'ai posée, à savoir générer des fichiers PDF à partir de l'entrée de formulaire en utilisant Latex.
Selon http://www.tug.org/tutorials/latex2e/Special_Characters.html les caractères spéciaux en latex sont # $ % & ~ _ ^ \ { }
. La plupart peuvent être échappés avec un simple backslash mais _
^
et \
besoin d'un traitement spécial.
Pour caret utiliser \^{}
(ou \textasciicircum
), pour tilde utiliser \~{}
(ou \textasciitilde
) et pour les antislash\textbackslash
si vous voulez que les entrées de l'utilisateur apparaissent comme du texte de machine à écrire, il y a aussi le \verb
commande qui peut être utilisé comme \verb+asdf$$&\~^+
, le +
peut être n'importe quel caractère, mais ne peut pas être dans le texte.
Vous voudrez probablement vous assurer que votre \write18
est désactivé.
voir http://www.fceia.unr.edu.ar/lcc/cdrom/Instalaciones/LaTex/MiKTex/doc/ch04s08.html et http://www.texdev.net/2009/10/06/what-does-write18-mean/