2010-03-29 13 views
15

Wir haben den Online-Service implementiert, wo es möglich ist, PDF mit der vordefinierten Struktur zu generieren. Der Benutzer kann eine LaTeX-Vorlage auswählen und sie dann mit geeigneten Eingaben kompilieren.Wie können Sonderzeichen im LaTeX-Dokument entfernt/entfernt werden?

Die Frage, um die wir uns sorgen, ist die Sicherheit, dass der böswillige Benutzer nicht in der Lage war, Shell-Zugriff durch die Injektion spezieller Anweisungen in ein Latexdokument zu erlangen.

Wir benötigen eine Abhilfe für diese oder zumindest eine Liste von Sonderzeichen, die wir aus den Eingabedaten entfernen sollten.

Bevorzugte Sprache wäre PHP, aber alle Vorschläge, Konstruktionen und Links sind sehr willkommen.

PS. in wenigen Wort suchen wir mysql_real_escape_string für LaTeX

+0

Ich bin mir nicht sicher, welche Art von bösartigem Code kann in LaTeX geschrieben werden, aber ich bin mir ziemlich sicher, dass es keine PHP-Äquivalent für LaTeX von mysql_real_escape_string. Ich stelle mir vor, dass Sie einfach ein paar reguläre Ausdrücke finden möchten, um Zeilen auszuschneiden, die Sie nicht wollen, solange Sie wissen, wonach Sie suchen. –

+0

Ich habe die Frage beantwortet und dann realisiert, dass ich nicht sicher bin, ob meine Antwort die Frage beantwortet.Über welche Art von Vorlagen sprechen wir: Vorlagen basierend auf typischen Webformularen oder einige hochgeladene Dateien mit Latex-Markup? Letzteres ist ein Problem, über das ich selbstständig nachgedacht habe ... –

+0

@Charles Stewart: Die Frage entstand in der PDF-Generierung aus den Webformular-Eingaben, aber die allgemeinere Frage nach Uploads ist auch interessant! – Igor

Antwort

3

Die einzige Möglichkeit (AFAIK) schädliche Operationen auszuführen Latex verwendet werden, um die Möglichkeit zu ermöglichen, externe Befehle aufzurufen \write18 verwenden. Dies funktioniert nur, wenn Sie LaTeX mit dem Argument --shell-escape oder --enable-write18 (abhängig von Ihrer Distribution) ausführen.

Solange Sie es nicht mit einem dieser Argumente ausführen, sollten Sie sicher sein, ohne dass Sie irgendwelche Teile herausfiltern müssen.

Außerdem kann man noch andere Dateien mit den Befehlen \newwrite, \openout und \write schreiben. Wenn der Benutzer Dateien erstellt und (über) schreibt, ist das möglicherweise unerwünscht? So könnten Sie das Auftreten dieser Befehle herausfiltern. Aber das Halten von Blacklists bestimmter Befehle neigt zum Scheitern, da jemand mit einer schlechten Absicht den tatsächlichen Befehl leicht verbergen kann, indem er das Eingabedokument unscharf macht.

bearbeiten: Ausführen des LaTeX-Befehl ein eingeschränktes Konto verwenden (dh ohne schriftliche nicht Latex/projektbezogene Verzeichnisse) in Kombination mit \write18 deaktivieren könnte einfacher und sicherer sein als eine schwarze Liste von ‚gefährlich‘ zu halten Befehle.

+0

Danke Veger! Ihre Antwort, die mit Geoffs Reedy-Post zusammengeführt wird, gibt diesen perfekten Intrusion-proof Quittung. – Igor

+1

Benutzer könnten bösartige CPU-intensive LaTeX-Schleifen schreiben. –

+0

Benutzer können immer noch beliebige Dateien z. mit '\ input {/ etc/passwd}'. – pcworld

2

Gemäß http://www.tug.org/tutorials/latex2e/Special_Characters.html sind die Sonderzeichen in Latex # $ % & ~ _^\ { }. Die meisten können mit einem einfachen Backslash maskiert werden, aber _^ und \ brauchen spezielle Behandlung.

Für caret Verwendung \^{} (oder \textasciicircum), für Tilde Verwendung \~{} (oder \textasciitilde) und für Backslash \textbackslash

verwenden Wenn Sie die Benutzereingabe Text erscheinen als Schreibmaschine wollen, gibt es auch den \verb Befehl des wie \verb+asdf$$&\~^+ verwendet werden, kann die + ein beliebiges Zeichen sein, kann aber nicht im Text enthalten sein.

+0

Das stimmt, aber diese Zeichen stellen keine Sicherheitsbedrohung für den Online-Dienst des OP dar. – Veger

+1

Wenn Sie diese Zeichen, insbesondere \, wegführen, verhindern Sie, dass sie ein Markup einfügen. Das ist das Äquivalent zu einem mysql_real_escape_string Äquivalent. – staticsan

+0

@Veger: Ja wie das Symbol "'" keinen Schaden in der SQL-Abfrage, aber an der richtigen Stelle, und wenn Sie nicht möchten, dass einige LaTeX-spezifische Sonderzeichen injizieren müssen Sie sie in der gleichen zu entkommen So wie Sie es bei SQL-Abfragen tun. Das habe ich gesucht und finde die Antwort sehr passend! – Igor

2

Im Allgemeinen ist das Erzielen von Sicherheit nur durch entkommene Befehlssequenzen schwer zu erreichen, ohne drastisch die Expressivität zu reduzieren, da es keine prinzipielle Möglichkeit gibt, sichere cs von unsicheren zu unterscheiden: Tex ist einfach nicht sauber genug, um dies zu ermöglichen .Ich würde sagen, diesen Ansatz zugunsten der Beseitigung von Sicherheitslücken aufgeben.

Veger's Zusammenfassung der Sicherheitslücken in Latex entspricht meiner: d. H. Die Probleme sind Shell Escapes und File Creation.Overwriting, obwohl er eine Shell Escape Schwachstelle vermisst hat. Einige weitere Punkte folgen, dann einige Empfehlungen:

  1. Es genügt nicht, sich aktiv zu vermeiden --shell-escape Aufruf, da sie implizit in texmf.cnf aktiviert werden kann. Sie sollten --no-shell-escape explizit übergeben, um texmf.cnf zu überschreiben;
  2. \write18 ist ein Primitiv von Etex, nicht von Knuth's Tex. Sie können also Latices vermeiden, die es implementieren (was leider die meisten von ihnen sind);
  3. Wenn Sie Dvips verwenden, gibt es ein weiteres Risiko: \special Befehle können .dvi-Dateien erstellen, die dvips bitten, Shell-Befehle auszuführen. Sie sollten also, wenn Sie dvips verwenden, den Befehl -R2 ausführen, um das Aufrufen von Shell-Befehlen zu verbieten;
  4. texmf.cnf können Sie angeben, wo Tex Dateien erstellen kann;
  5. Sie können nicht vermeiden, die Erstellung von Schriftarten zu deaktivieren, wenn Sie Ihren Kunden viel Freiheit bei der Erstellung von Schriftarten geben möchten. Werfen Sie einen Blick auf the notes on security for Kpathsea; Das Standardverhalten erscheint mir vernünftig, aber Sie könnten eine Benutzerbaumstruktur haben, um zu verhindern, dass ein Benutzer auf die Zehen eines anderen Benutzers tritt.

Optionen:

  1. Sandbox Ihres Kunden Latex Anrufungen, und erlauben ihnen die Freiheit in der Sandbox schlecht zu benehmen;
  2. Vertraue auf die Standardeinstellungen von kpathsea und verbiete Shell Escapes in Latex und anderen ausführbaren Dateien, die zum Erstellen der PDF-Ausgabe verwendet werden.
  3. Reduzieren Sie drastisch die Expressivität und verbieten Sie Ihren Kunden die Möglichkeit, Schriftdateien oder neue Client-spezifische Dateien zu erstellen. Führe Latex als einen Prozess aus, der nur bestimmte bereits existierende Dateien schreiben kann;
  4. Sie können eine Formatdatei erstellen, in der die \write18 CS und die Dateierstellung css nicht gebunden sind, und nur Makros, die sie sicher aufrufen, z. B. für font/toc/bbl creation, existieren. Das bedeutet, dass Sie entscheiden müssen, welche Funktionalität Ihre Kunden haben: Sie können nicht frei wählen, welche Pakete sie importieren, sondern müssen die Auswahl treffen, die Sie ihnen auferlegt haben. Abhängig davon, welche Art von "Vorlagen" Sie im Sinn haben, könnte dies eine gute Option sein, die die Verwendung von Paketen erlaubt, die Shell-Escapes verwenden, aber Sie müssen den Tex/Latex-Code überprüfen, der in Ihre Formatdatei geht.

Postscript

Es gibt einen TUGboat Artikel, mit Latex Server side PDF generation based on LATEX templates, Adressierung eine andere mit der auf die Frage, nehme ich getroffen haben, nämlich PDFs von Formulareingabe zu erzeugen.

+0

Danke Charles! Deine Erklärung geht über meine LaTeX-Erfahrung hinaus. Der letzte Link war sehr nützlich für mich und die Referenzen am Ende dieses Artikels gibt eine Menge Quellen zu diesem Thema zu lesen. – Igor

15

Hier ist ein Code zum Implementieren der Geoff Reedy-Antwort. Ich platziere diesen Code in der Public Domain.

<? 

$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); 
} 
+6

Sie müssen "\\ textbackslash" in "\\ textbackslash {}" ändern, um eine ordnungsgemäße Verarbeitung zu gewährleisten, wenn der umgekehrte Schrägstrich vor dem Text liegt. Ich habe versucht, es zu bearbeiten, aber stackoverflow würde keine Bearbeitung mit zwei Zeichen erlauben :-( – ruquay

Verwandte Themen