Overflowed Stack,
我有一个Java Web应用程序(tomcat),我允许用户通过表单上传HTML代码。
现在因为我在tomcat上运行而且我实际上显示了用户上传的HTML,我不希望用户恶意编写JSP标记/ scriptlet / EL并在服务器上执行这些代码。我想过滤掉任何JSP /非HTML内容。
自己写一个解析器似乎太麻烦 - 除了需要处理的许多细微之处(注释,脚本的字节表示等)。
你知道任何为我这样做的API /库吗?我知道Caja过滤,但我正在寻找专门针对JSP的东西。
非常感谢, JP,马耳他。
答案 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编写一个小标记:
我不知道是否所有潜在的恶意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 - 如果有的话。大多数网站(如此网站)使用特殊标记进行格式化有两个原因: