Мы реализовали онлайн-сервис, где возможно генерировать PDF с предопределенной структурой. Пользователь может выбрать шаблон LaTeX и затем скомпилировать его с соответствующие исходные данные.
Вопросом, о котором мы волнуемся, является безопасность, что злонамеренный пользователь не смог получить доступ оболочки посредством инжекции специальной инструкции в латексный документ.
Нам нужны некоторое обходное решение для этого или по крайней мере список специальных символов, которые мы должны разделить от входных данных.
Предпочтительный язык был бы PHP, но любые предложения, конструкции и ссылки являются очень встречаемыми с одобрением.
PS. в немногих слово мы ищем mysql_real_escape_string для ЛАТЕКСА
Единственная возможность (AFAIK) выполнять вредные операции с помощью LaTeX - это включить возможность вызова внешних команд с помощью \write18
. Это работает, только если вы запускаете LaTeX с аргументом --shell-escape или --enable-write18 (в зависимости от вашего дистрибутива).
Так что, если вы не запускаете его с одним из этих аргументов, вы должны быть в безопасности без необходимости отфильтровывать какие-либо части.
Кроме того, можно записывать другие файлы, используя команды \newwrite
, \openout
и \write
. Создание и (чрезмерная) запись файлов пользователем может быть нежелательной? Поэтому вы можете отфильтровать появление этих команд. Но ведение черных списков определенных команд чревато неудачей, поскольку кто-то с плохими намерениями может легко скрыть фактическую команду, обфусцировав входной документ.
Правка: Запуск команды LaTeX с использованием ограниченной учетной записи (т.е. без записи в каталоги, не связанные с latex/project) в сочетании с отключением \write18
может быть проще и безопаснее, чем ведение черного списка "опасных" команд.
В общем, обеспечение безопасности исключительно за счет экранирования последовательностей команд трудно обойтись без резкого снижения выразительности, поскольку нет принципиального способа отличить безопасные cs от небезопасных. one: Tex просто недостаточно чистый язык программирования, чтобы позволить это. Я бы посоветовал отказаться от этого подхода в пользу устранения дыр в безопасности.
Резюме Вегера о дырах в безопасности в Latex совпадает с моим: то есть, проблемы связаны с экранированием оболочки и созданием файла. Перезапись, хотя он пропустил уязвимость экранирования оболочки. Далее следуют некоторые дополнительные моменты, а затем некоторые рекомендации:
- shell-escape
, поскольку он может быть неявно включен в texmf.cnf. Вы должны явно передать - no-shell-escape
, чтобы переопределить texmf.cnf; \ write18
является примитивом Etex, а не Tex Кнута. Так что вы можете избежать латексов, которые его реализуют ( К сожалению, их большинство); \ special
могут создавать файлы .dvi, которые просят dvips выполнять команды оболочки.Поэтому вам следует, если вы используете dvips, передать команду -R2
, чтобы запретить вызов команд оболочки; Параметры:
\ write18
cs и css создания файла не связаны, а только макросы которые вызывают их безопасно, например, для создания font / toc / bbl. Это означает, что вы должны решить, какие функции есть у ваших клиентов: они не смогут свободно выбирать, какие пакеты они импортировать, но должны использовать выбор, который вы им наложили. В зависимости от того, какие «шаблоны» вы имеете в виду, это может быть хорошим вариантом, позволяющим использовать пакеты, использующие экранирование оболочки, но вам нужно будет проверить код Tex / Latex, который входит в ваш файл формата.Postscript
Там есть статья TUGBoat, Создание PDF на стороне сервера на основе шаблонов LATEX , в которой рассматривается другой подход к вопросу, который я взял, а именно создание PDF-файлов из ввода формы с использованием Latex.
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 /
Согласно http://www.tug.org/tutorials/latex2e/Special_Characters.html специальными символами в латексе являются # $% & ~ _ ^ \ {}
. Большинство из них можно экранировать простой обратной косой чертой, но _
^
и \
требуют особой обработки.
Для вставки используйте \ ^ {}
(или \ textasciicircum
), для тильды используйте \ ~ {}
(или \ textasciitilde
) и для обратной косой черты используйте \ textbackslash
. Если вы хотите, чтобы вводимые пользователем данные отображались как текст пишущей машинки, существует также команда \ verb
, которая может использоваться как \ verb + asdf $$ & \ ~ ^ +
, +
может быть любым символом, но не может быть в тексте.