Как выйти/разделить из специальных символов в ЛАТЕКСНОМ документе?

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

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

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

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

PS. в немногих слово мы ищем mysql_real_escape_string для ЛАТЕКСА

15
задан Charles Stewart 25 May 2010 в 13:00
поделиться

4 ответа

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

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

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

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

3
ответ дан 1 December 2019 в 03:14
поделиться

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

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

  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 и запрещайте экранирование оболочки в латексе и любых других исполняемых файлах, используемых для создания вывода PDF;
  3. Существенно уменьшите выразительность, запретив вашим клиентам возможность создавать файлы шрифтов или любые новые файлы, указанные клиентом. Запускать latex как процесс, который может записывать только в определенные уже существующие файлы;
  4. Вы можете создать файл формата, в котором \ write18 cs и css создания файла не связаны, а только макросы которые вызывают их безопасно, например, для создания font / toc / bbl. Это означает, что вы должны решить, какие функции есть у ваших клиентов: они не смогут свободно выбирать, какие пакеты они импортировать, но должны использовать выбор, который вы им наложили. В зависимости от того, какие «шаблоны» вы имеете в виду, это может быть хорошим вариантом, позволяющим использовать пакеты, использующие экранирование оболочки, но вам нужно будет проверить код Tex / Latex, который входит в ваш файл формата.

Postscript

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

3
ответ дан 1 December 2019 в 03:14
поделиться

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

0
ответ дан 1 December 2019 в 03:14
поделиться

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

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

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

2
ответ дан 1 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: