Мы внедрили онлайн-сервис, где можно создавать 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, хотя он упустил уязвимость выхода из оболочки. Далее следуют дополнительные пункты, затем некоторые рекомендации:
--shell-escape
, поскольку он может быть неявно включен в texmf.cnf. Вы должны явно передать --no-shell-escape
чтобы переопределить texmf.cnf; \write18
– это примитив Etex, а не Knuth's Tex, поэтому вы можете избежать латеков, которые его реализуют (что, к сожалению, большинство из них); \special
команды могут создавать файлы .dvi, которые запрашивают dvips для выполнения команд оболочки. Поэтому, если вы используете dvips, передайте команду -R2
чтобы запретить вызов команд оболочки; Опции:
\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-средний /