【问题标题】:Clean up user input from unwanted HTML in a Spring web application在 Spring Web 应用程序中从不需要的 HTML 中清理用户输入
【发布时间】:2011-03-25 03:31:09
【问题描述】:

我需要整理 Web 应用程序中的用户输入,以便删除某些 HTML 标记并将

我已经制作了几个简单的 util 方法来去除 HTML,但我发现自己在我的应用程序中随处添加了这些方法。

有没有更聪明的方法来整理用户输入?例如。在绑定过程中,还是以某种方式作为过滤器?

我见过可以充当 servlet 过滤器的 JTidy,但我不确定这是否是我想要的,因为我需要清理用户输入,而不是我的 JSP 的输出。

来自 JTidy 的主页:

它可以用作清理动态 Web 应用程序生成的格式错误和错误的 HTML 的工具。

它可以在不更改输出的情况下验证 HTML,并为每个页面生成警告,以便您识别需要修复的 JSP 或 Servlet。

它可以为您节省数小时的时间。您在 JSP 或 Servlet 中编写的 HTML 越多,您节省的时间就越多。不要浪费时间手动寻找问题,找出您的 HTML 显示不正常的原因。

除了 JTidy 验证之外,您还可以将动态生成的页面提交给在线 HTML 验证器,例如 W3C 标记验证服务、WAVE 可访问性工具或 WDG HTML 验证器,即使您位于防火墙后面。

【问题讨论】:

    标签: java spring-mvc


    【解决方案1】:

    Spring MVC 中有一个 Interceptor 接口,它可以用来在每个请求上做一些常见的事情。无论您使用哪种工具进行整理,您都可以使用它来获得您需要的东西。请参阅this manual 以使用 ut 进行管理。只需将整理程序放入preHandle 方法并遍历HttpServletRequest 中的数据即可更新它。

    【讨论】:

      【解决方案2】:

      我发现自己在我的应用程序中到处添加这些。

      真的吗? 许多 用户输入接受 HTML 是不寻常的。大多数输入应该是纯文本,因此当用户键入< 时,他们实际上会得到一个小于号,而不是(可能已整理/过滤掉的)标签。这需要在输出阶段进行 HTML 编码。通常你会从<c:out> 标签中得到它。

      (可悲的是,在 JSTL 之前的老式 JSP 没有提供 HTML 编码器,因此如果出于某种原因您正在使用它,您将不得不提供您自己的由字符串替换构建的 HTML 编码方法,或者使用众多第三方工具之一。)

      对于那些 有意接受用户提供的 HTML 的通常很少有的“富文本”字段,您应该对它们进行严格过滤,以防止标记中的 JavaScript 注入。这是一项艰巨的工作!一些“去除 HTML 的简单 util 方法”不太可能正确且安全地完成。

      正确的做法是将输入的 HTML 解析为 DOM;走过它,检查是否只使用了已知安全的元素和属性名称;然后将其序列化回格式良好的 [X]HTML。有许多工具可以做到这一点,是的,jTidy 就是其中之一。您可以在输入字段值上使用 Tidy.parseDOM 方法,使用 removeChildremoveAttribute 从生成的 DOM 中删除不需要的项目,然后使用 pprint 重新序列化。

      基于 HTML 的富文本的一个很好的替代方法是为用户提供一种更简单的文本标记形式,然后您可以将其转换为已知安全的 HTML 标记。就像我现在正在输入的这个 SO 文本框。

      【讨论】:

      • 很好的答案。 与仅使用 ${foo} 打印出来对我来说是新闻。这对我有很大帮助。我在客户端使用 CKEditor 有几个所见即所得的输入,我需要在服务器端添加 JTidy(或类似的)以允许某些标签。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2014-08-18
      • 1970-01-01
      相关资源
      最近更新 更多