Как избежать / удалить специальные символы в документе LaTeX?

мы внедрили онлайн-сервис, где можно генерировать PDF с предопределенными структура. Пользователь может выбрать шаблон LaTeX, а затем скомпилировать его с соответствующими входными данными.

вопрос, о котором мы беспокоимся, - это безопасность, что вредоносный пользователь не смог получить доступ к оболочке через инъекцию специальной инструкции в документ latex.

нам нужен обходной путь для этого или, по крайней мере, список специальных символов, которые мы должны полоса из входных данных.

предпочтительным языком будет PHP, но любые предложения, конструкции и ссылки очень приветствуются.

PS. в нескольких словах мы ищем использования mysql_real_escape_string латекс

5 ответов


единственная возможность (AFAIK) выполнять вредные операции с помощью LaTeX-включить возможность вызова внешних команд с помощью \write18. Это работает только при запуске LaTeX с аргументом --shell-escape или --enable-write18 (в зависимости от вашего дистрибутива).

до тех пор пока вы не столкнетесь с одним из этих аргументов, вы должны быть в безопасности без необходимости, чтобы исключить любые части.

кроме того, по-прежнему можно писать другие файлы с помощью \newwrite, \openout и \write команды. Создание и (более)запись файлов пользователем может быть нежелательным? Таким образом, вы можете отфильтровать вхождения этих команд. Но хранение черных списков определенных команд склонно к сбою, так как кто-то с плохим намерением может легко скрыть фактическую команду, запутав входной документ.

редактировать: запуск команды LaTeX с использованием ограниченной учетной записи (т. е. без записи в каталоги, не связанные с latex/project) в комбинация с отключением \write18 может быть проще и безопаснее, чем хранить черный список "опасных" команд.


вот код для реализации ответа Джеффа Риди. Я помещаю этот код в общественное достояние.

<?

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

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

в общем, достижение безопасности исключительно за счет экранирования командных последовательностей трудно сделать без резкого снижения выразительности, поскольку нет принципиального способа отличить безопасные cs от небезопасных: Tex-это просто недостаточно чистый язык программирования, чтобы позволить это. Я бы сказал, отказаться от этого подхода в пользу устранения существования дыр в безопасности.

сводка Вегера отверстий безопасности в латексе соответствует моей: т. е. проблемы-это бегство от оболочки и создание файла.перезапись, хотя он пропустил уязвимость shell escape. Далее следуют некоторые дополнительные пункты, затем некоторые рекомендации:

  1. этого недостаточно, чтобы избежать активного вызова --shell-escape, поскольку он может быть неявно включен в texmf.cnf. Вы должны явно передать --no-shell-escape для переопределения texmf.cnf;
  2. \write18 является примитивом Etex, а не Tex кнута. Таким образом, Вы можете избежать латексов, которые его реализуют (что, к сожалению, большинство их);
  3. если вы используете Dvips, есть еще один риск:\special команды могут создать .файлы dvi, которые просят dvips выполнять команды оболочки. Поэтому вы должны, если вы используете dvips, передать -R2 команда для запрета вызова команд оболочки;
  4. в texmf.cnf позволяет указать, где Tex может создавать файлы;
  5. вы не сможете избежать отключения создания шрифтов, если хотите, чтобы ваши клиенты имели большую свободу в создании шрифтов. Взгляните на примечания по безопасности для Kpathsea; поведение по умолчанию кажется мне разумным, но у вас может быть дерево шрифтов для каждого пользователя, чтобы предотвратить наступление одного пользователя на пальцы другого пользователя.

варианты:

  1. песочница Latex вызовы вашего клиента, и позволить им свободу шалить в песочнице;
  2. поверьте в значения по умолчанию kpathsea и запретите экранирование оболочки в latex и любых других исполняемых файлах, используемых для создания PDF выход;
  3. резко уменьшить выразительность, запрещая своим клиентам возможность создавать файлы шрифтов или любые новые файлы, указанные клиентом. Запустите latex как процесс, который может записывать только некоторые уже существующие файлы;
  4. вы можете создать файл формата, в котором \write18 cs и css создания файлов, не связаны, и только макросы, которые вызывают их безопасно, такие как для создания шрифта/toc/bbl, существуют. Это означает, что вы должны решить, какие функции ваши клиенты: они не смогут свободно выбирать, какие пакеты они импортируют, но должны использовать выбор, который вы им навязали. В зависимости от того, какие "шаблоны" вы имеете в виду, это может быть хорошим вариантом, позволяющим использовать пакеты, которые используют эскейпы оболочки, но вам нужно будет провести аудит кода Tex/Latex, который входит в ваш файл формата.

Postscript

есть статья о буксире,генерация PDF на стороне сервера на основе LATEX шаблоны, обращаясь к другому вопросу к тому, который я взял, а именно к генерации PDF-файлов из ввода формы с помощью Latex.


согласно http://www.tug.org/tutorials/latex2e/Special_Characters.html специальные символы в latex являются # $ % & ~ _ ^ \ { }. Большинство можно избежать с помощью простой обратной косой черты, но _ ^ и \ нуждаются в особом лечении.

для вставки используйте \^{} (или \textasciicircum), для Тильды использовать \~{} (или \textasciitilde) и для обратной косой черты используйте \textbackslash

если вы хотите, чтобы пользовательский ввод отображался как текст пишущей машинки, есть также \verb команда, которая может Используйте как \verb+asdf$$&\~^+, the + может быть любым символом, но не может быть в тексте.


вы, вероятно, захотите убедиться, что ваш \write18 отключено.

см.http://www.fceia.unr.edu.ar/lcc/cdrom/Instalaciones/LaTex/MiKTex/doc/ch04s08.html и http://www.texdev.net/2009/10/06/what-does-write18-mean/