背景
用户可以提供文本,然后使用 XSL 将其转换为 LaTeX 文档。转换 XML 文档(包含用户定义的文本)的 XSL 模板当前类似于:
<xsl:template match="user-text">
<xsl:text> \item </xsl:text>
<xsl:apply-templates />
</xsl:template>
然后将其转换为:
\item This is the text the user provided.
问题
这允许用户提交恶意制作的 LaTeX:
\item This is the \{latex} the user provided.
想法
一些想法:
\begin{verbatim}
并\end{verbatim}
导致文本以无格式显示(即等宽字体)。- 编写一个 XSLT 函数来转义特殊字符。
问题
确保用户定义的文本不会被解释为 LaTeX 代码的最简单方法是什么?
\begin{verbatim}
如果它不改变字体并防止文本换行,那么类似的东西将是完美的。
有关的
答案1
如果您想要使 LateX 语法在用户输入中无害,它要么需要匹配的括号(以便您可以将材料作为参数传递出去\scantokens
),要么需要已知不是材料一部分的“停止”标记序列,例如,\end{verbatim}
或+
在\verb+foo+
。
如果您对用户输入没有任何控制权,那么两者都无法保证,例如,如果用户写道:“此文本包含 \end{verbatim},现在我可以自由使用 \LaTeX{} 代码。”会发生什么?然后它将崩溃或至少执行第二部分。
因此,如果安全很重要,那么我认为 XSLT 是最佳选择。如果您可以忍受这种危险,那么可以考虑更改\verbatim@font
设置verbatim
和中使用的字体的命令\verb
。其默认定义是
\def\verbatim@font{\normalfont\ttfamily}
因此,如果您将其更改为“不执行任何操作”,那么您将获得正常的正文字体。
更新(抱歉,时间不对)
当然,这并不能解决“逐字”不换行的问题。要解决这个问题,真正需要的是编写自己的“逐字”环境版本,它不会将空格更改为活动状态,也不会添加
\obeylines \verbatim@font \@noligs
\hyphenchar\font\m@ne
\everypar \expandafter{\the\everypar \unpenalty}%
首先,因为他们是你的罪犯。