【问题标题】:Can I prevent a user from submitting malicious XSL code to hack the server?我可以防止用户提交恶意 XSL 代码来入侵服务器吗?
【发布时间】:2026-01-29 03:55:01
【问题描述】:

在我的网页中,我将允许客户端 (X)HTML。为了避免 XSS,我将使用HTML Purifier,并禁用<script> 标签(以及其他一些危险标签)。

然而,我希望那些 (X)HTML 的设计者能够使用某些类似编程的功能,例如显示需要 for 循环的项目列表。

然后我想出了这样的想法:用户提交XSL代码,我向XML提供用户需要的数据。

由于 HTML Purifier 无法清理 XSL 代码(可以吗?),我建议的流程是:

  1. 用户提交一段 XSL 代码。
  2. 在服务器中,有一些示例数据(示例 XML)。 PHP 用于对这些示例 XML 数据进行 XSL 转换。
  3. 将输出 XHTML 传递给 HTML Purifier。如果 HTML Purifier 在代码中检测到任何被禁止的元素,则停止进程并向用户显示错误。
  4. 如果它通过了 HTML Purifier,请对照 W3C validator 检查它。 (这只是一个双重检查。HTML Purifier 的输出应该是有效的。)
  5. 将这段 XSL 代码保存到数据库中。在需要时使用(包括)它。

您认为上面的流程可以确保保存到数据库中的最终 XSL 代码是干净的(假设 HTML Purifier 是完美的)?

另一个问题是,(这是这里的主要问题),接受任意 XSL 代码并在服务器中通过 PHP 执行 XSL 转换是否安全? XSL代码中是否包含一些XSS、注入等安全漏洞,从而对服务器或PHP程序有害?

最后,如果有任何其他想法/设计来实现这一点,欢迎任何解决方案!

【问题讨论】:

  • @Mathias,感谢您的校对。请一起解决这个问题:D
  • 如果你期望别人帮助你,至少接受他们迄今为止给出的答案。
  • 你的答案是什么?
  • 到目前为止,您已经问了许多其他问题,但很少接受答案——即使用户花时间制定了良好而全面的答案。
  • @MathiasMüller 感谢您的发现。让我尽快复习一下这个问题。

标签: php xslt xhtml htmlpurifier


【解决方案1】:

绝对不是。 XSL 是图灵完备的,用户提交的 XSL 脚本至少会耗尽你所有的 CPU,最糟糕的是,在你的服务器上运行代码。

即使 XSL 有效,也绝对没有迹象表明在单个测试输入上运行并不意味着 XSL 无法在特制输入上产生 XSS 输出。

【讨论】:

  • 哇非常感谢您发现 XSLT 是一种图灵完备的语言,它可以做任何损害服务器的事情!对于您的第二点,我想这不会是一个严重的问题,因为确保 XML 是干净的。 XSL 转换的测试运行不仅针对单个 XML,还针对不同的 XML,例如“空情况”和“特殊情况”。如果所有案例的输出都通过了 HTML Purifier,我假设实际转换的 XHTML 将是干净的。如果我的想法不可行,您有什么建议吗?如果没有更好的解决方案,这绝对是最好的答案。
  • 您认为只允许某些 XSLT 函数子集可以在提供功能的同时解决问题吗?例如只允许<xsl:for-each><xsl:if>等。
【解决方案2】:

在允许用户提交自己的 XSLT 时要考虑的另一件事是,XSLT 文件本身就是 XML 文件,可能会受到 Billion Laughs(XML 炸弹)攻击之类的攻击。

【讨论】:

  • +1 感谢您发现这一点。这确实存在很多安全问题....