背景

背景

背景

用户可以提供文本,然后使用 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}%

首先,因为他们是你的罪犯。

相关内容