【问题标题】:How to filter (remove) JSP content from user-submitted pages如何从用户提交的页面中过滤(删除)JSP 内容
【发布时间】:2011-03-27 17:06:22
【问题描述】:

溢出堆栈,

我有一个 Java Web 应用程序 (tomcat),我允许用户通过表单上传 HTML 代码。

现在,由于我在 tomcat 上运行并且我实际上显示了用户上传的 HTML,我不希望用户对 JSP 标记/scriptlet/EL 进行恶意编码,并在服务器上执行这些代码。我想过滤掉任何 JSP/非 HTML 内容。

自己编写解析器似乎太繁重了——除了需要处理的许多细微之处(cmets、脚本的字节表示等)。

你知道有什么 API/库可以为我做这件事吗?我知道 Caja 过滤,但正在寻找专门针对 JSP 的东西。

非常感谢, JP,马耳他。

【问题讨论】:

    标签: java jsp filtering


    【解决方案1】:

    只需将其保存为*.html,而不是*.jsp,它就不会通过完成所有taglib/EL 处理工作的JspServlet。所有 taglibs/EL 都会以普通(未解析)作为响应。

    【讨论】:

    • 感谢 Balus,但我们不能这样做,因为我们自己将 JSP 脚本添加到用户上传的内容中(因此我们需要渲染这些内容)。
    【解决方案2】:

    使用库进行内容清理比尝试自己进行内容清理要好,例如正则表达式。

    试试 Open Web Application Security Project 的 Antisamy。

    http://www.owasp.org/index.php/Antisamy

    我还没有使用它(还),但似乎是合适的。 JSP 内容应该被 HTML 规范化自动删除/转义。

    编辑,刚刚找到这些:
    Best Practice: User generated HTML cleaning
    RegEx match open tags except XHTML self-contained tags

    【讨论】:

    • 有趣的帖子。与 Google 的 Caja 相比会更有趣——这似乎是该领域的事实标准。
    • 以前不知道 Caja,这很有趣。似乎特别适合嵌入 3rdparty 小部件。
    【解决方案3】:

    如果web.xml 中未提及用户提供的页面并且 您在web.xml 中没有“任何以 *.jsp 结尾的内容都是 JSP”的规则, Tomcat 不会尝试编译/运行它们。

    更重要的是:您必须过滤 HTML,否则用户可以添加任意 JavaScript,从而窃取其他用户的密码。这是不平凡的。尝试使用 JTidy 清理代码以获取 XML,然后删除所有 <script> 标签、<link><object>,甚至可能是 <img>(除非您确保提供的 URL 有效;一些有问题的浏览器可能会运行JavaScript 如果图像源实际上是text/JavaScript,所有CSS 样式并确保任何href 指向一个安全的URL。不要忘记<iframe><applet> 以及所有其他可能破坏您的安全外壳的东西。

    [编辑] 那应该让你知道它的去向。最后,您应该反其道而行之:只允许非常小的 HTML 子集——如果有的话。大多数网站(比如这个)使用特殊标记来格式化,原因有两个:

    1. 对用户来说更简单
    2. 更安全

    【讨论】:

    • 这不准确。如果您有一个 jsp 页面,则无需在 web.xml 中列出它即可运行。在我对其进行一些处理之后,用户上传的内容被保存到一个 jsp 页面。
    • 所以你有意创建了一个新的JSP?这对我来说听起来非常很危险。如果有人向我提出这个建议,我会说“不”或“我需要半年时间才能做好”。如果可以避免,请不要这样做。
    • 好吧,既然做出这个决定的人显然根本不关心安全性,为什么还要费心过滤呢?
    【解决方案4】:

    我没有删除 JSP 标记的库,但您可以根据正则表达式编写一个小库:

    • 删除所有“”标签
    • 删除所有包含 ':' 字符的 HTML 标记(例如,避免使用“”标记

    我不知道这两个过滤器是否包含所有潜在的恶意 Java 代码,但这是一个好的开始...

    另一种解决方案,但稍微复杂一点:使用 http 代理服务器(Apache httpd、Nginx 等),它将直接提供静态资源(css、图像、html 页面)并仅转发给 Tomcat 动态资源(JSP和 .do 动作,例如)。 上传文件时,您将文件扩展名强制为“.html”。您确定(感谢 http 代理)该文件不会被 Tomcat 解释。

    【讨论】:

      【解决方案5】:

      不用担心执行 JSP 代码。您的 JSP 将被转换为 servlet 一次,因此您将拥有如下内容:

      out.println(contents);
      

      并且contents 不会被评估为JSP 代码。但是你必须担心恶意javascript

      【讨论】:

      • 上传的 HTML 保存在文件系统中并直接提供给用户...所以,是的,我必须担心可能由用户注入并在服务器上运行的 JSP 标签。
      • 如果它被保存为.jsp,这是错误的做法。将其保存为 .txt 并将其加载为字符串。
      • 没错。这里似乎有一个重大的误解。
      • 将它保存为 JSP,因为我们向它添加了 scriptlet 来做一些特别的花哨的事情。
      • 除了向文件中添加小脚本外,您不能使用带有这些小脚本的模板吗?
      【解决方案6】:

      我不确定我是否完全理解你的问题,但如果你想用“”删除环绕中的所有内容,你可以用正则表达式替换它。

      String resultString = subjectString.replaceAll("(?sim)<%@ .*? %>", "");
      

      【讨论】:

      • 维护起来太繁重了 - 和其他一千个标签呢?请注意,命名空间可能会被重命名,例如。这就是为什么我正在寻找一个图书馆来做到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2015-08-29
      • 2021-06-06
      相关资源
      最近更新 更多