我可以阻止用户提交恶意XSL代码来破解服务器吗?

时间:2013-12-20 07:28:20

标签: php xslt xhtml htmlpurifier

在我的网页中,我将允许客户端(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代码保存到数据库中。在需要时使用(包括)它。
  6. 您认为上面的流程可以确保保存到数据库中的最终XSL代码是否干净(假设HTML Purifier是完美的)?

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

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

2 个答案:

答案 0 :(得分:4)

绝对不是。 XSL是Turing Complete,用户提交的XSL脚本至少可以耗尽所有CPU,最糟糕的是,在服务器上运行代码。

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

答案 1 :(得分:1)

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