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

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

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

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

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

PS. в нескольких словах мы ищем mysql_real_escape_string для LaTeX

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

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

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

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

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

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

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

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

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

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

Резюме Veger о дырах безопасности в Latex соответствует моим: то есть, проблемы – это экранирование оболочки и создание файла .overwriting, хотя он упустил уязвимость выхода из оболочки. Далее следуют дополнительные пункты, затем некоторые рекомендации:

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

Опции:

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

постскриптум

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

Вероятно, вы захотите убедиться, что ваш \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-средний /