Как избежать / удалить специальные символы в документе 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. Далее следуют некоторые дополнительные пункты, затем некоторые рекомендации:
- этого недостаточно, чтобы избежать активного вызова
--shell-escape
, поскольку он может быть неявно включен в texmf.cnf. Вы должны явно передать--no-shell-escape
для переопределения texmf.cnf; -
\write18
является примитивом Etex, а не Tex кнута. Таким образом, Вы можете избежать латексов, которые его реализуют (что, к сожалению, большинство их); - если вы используете Dvips, есть еще один риск:
\special
команды могут создать .файлы dvi, которые просят dvips выполнять команды оболочки. Поэтому вы должны, если вы используете dvips, передать-R2
команда для запрета вызова команд оболочки; - в texmf.cnf позволяет указать, где Tex может создавать файлы;
- вы не сможете избежать отключения создания шрифтов, если хотите, чтобы ваши клиенты имели большую свободу в создании шрифтов. Взгляните на примечания по безопасности для Kpathsea; поведение по умолчанию кажется мне разумным, но у вас может быть дерево шрифтов для каждого пользователя, чтобы предотвратить наступление одного пользователя на пальцы другого пользователя.
варианты:
- песочница Latex вызовы вашего клиента, и позволить им свободу шалить в песочнице;
- поверьте в значения по умолчанию kpathsea и запретите экранирование оболочки в latex и любых других исполняемых файлах, используемых для создания PDF выход;
- резко уменьшить выразительность, запрещая своим клиентам возможность создавать файлы шрифтов или любые новые файлы, указанные клиентом. Запустите latex как процесс, который может записывать только некоторые уже существующие файлы;
- вы можете создать файл формата, в котором
\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/