如何从用户提交的页面中过滤(删除)JSP内容

时间:2010-08-10 08:47:11

标签: java jsp filtering

Overflowed Stack,

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

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

自己写一个解析器似乎太麻烦 - 除了需要处理的许多细微之处(注释,脚本的字节表示等)。

你知道任何为我这样做的API /库吗?我知道Caja过滤,但我正在寻找专门针对JSP的东西。

非常感谢, JP,马耳他。

6 个答案:

答案 0 :(得分:2)

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

out.println(contents);

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

答案 1 :(得分:2)

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

尝试Open Web应用程序安全项目的Antisamy。

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

我还没用过它,但似乎很合适。应该通过HTML规范化自动删除/转义JSP内容。

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

答案 2 :(得分:2)

只需将其保存为*.html,而不是*.jsp,然后它将不会通过执行所有taglib / EL处理工作的JspServlet传递。所有taglibs / EL将作为响应结束于普通(未解析)。

答案 3 :(得分:0)

我不确定我是否完全理解你的问题,但如果你想用“<%@ ..%>”删除周围的所有内容你可以用正则表达式替换它。

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

答案 4 :(得分:0)

我没有用于删除JSP标记的库,但您可以根据regexp编写一个小标记:

  • 删除所有“&lt; %%&gt;”标签
  • 删除所有包含“:”字符的HTML标记(以避免使用“”标记

我不知道是否所有潜在的恶意java代码都包含在这两个过滤器中,但它是一个良好的开端......

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

答案 5 :(得分:0)

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

更重要的是:您必须过滤HTML或用户可以添加任意JavaScript,然后窃取其他用户的密码。这不重要。尝试使用JTidy清除代码以获取XML,然后删除所有web.xml代码,<script><link>,甚至<object>(除非您确保提供的网址是有效的;如果图片来源实际为<img>,则有些错误的浏览器可能会运行JavaScript,所有CSS样式并确保所有text/JavaScript指向安全的网址。请勿忘记href<iframe>以及可能破坏你的安全shell的所有其他事情。

[编辑]这应该会让你知道这是怎么回事。最后,您应该反过来:只允许一小部分HTML - 如果有的话。大多数网站(如此网站)使用特殊标记进行格式化有两个原因:

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